Soovitatav, 2021

Toimetaja Valik

Erinevus funktsioonide ülekoormuse ja ülimuslikkuse vahel C ++-s

Polümorfism on OOPi üks olulisi omadusi. See tähendab lihtsalt ühe nime kasutamist mitme vormi jaoks. Polümorfismi saab rakendada funktsiooni ülekoormuse, operaatori ülekoormuse ja virtuaalse funktsiooni abil. Nii ülekoormamine kui ka ülekaalus viitavad polümorfismi kontseptsioonile. Siin on "ülekoormus" kompileerimisaja polümorfism ja "ülekaalukas" on käivitamisaja polümorfism. Edasine õppimine, kui me räägime suurest erinevusest "ülekoormuse" ja "ülekaaluka" puhul. Ülekoormuse puhul määratleme ülekoormatud funktsioonid uuesti sama funktsiooni nimega, kuid erineva arvu ja tüüpi parameetritega. Üleüldse funktsiooni prototüübi „ülekaalukas” puhul on kogu programmi puhul sama, kuid ülalnimetatud funktsioonile eelneb baasklassis märksõna „virtuaalne” ja see määratletakse tuletatud klassi poolt ilma märksõna võtmeta.

Lisaks uurime erinevust ülekoormuse ja ülekaalukuse vahel võrdluskaardi abil.


Võrdluskaart:

Võrdluse alusÜlekoormusÜlekirjutamine
PrototüüpPrototüüp erineb, kuna parameetrite arv või tüüp võib erineda.Kõik prototüübi aspektid peavad olema samad.
MärksõnaÜlekoormuse ajal ei rakendatud ühtegi märksõna.Funktsioon, mida tuleb ületada, on algklassis ees märksõna „virtuaalne”.
Eristav tegurParameetri arv või tüüp erineb, mis määrab funktsiooni versiooni.Millist klassi funktsiooni osutaja nimetab, määrab selle, millise klassi objekti sihtmärk on antud kursorile määratud.
Mustrite määratlemineFunktsioon määratletakse uuesti sama nimega, kuid erineva arvu ja parameetri tüübiga.Funktsioon on defineeritud, millele eelneb põhiklassis märksõna „virtuaalne” ja määratletakse ümber tuletatud klassi koos võtmeta märksõnaga.
Täitmise aegKoosta aeg.Käivitusaeg.
Konstruktor / virtuaalne funktsioonKonstruktoreid saab üle koormata.Virtuaalset funktsiooni saab tühistada.
Hävitaja
Destruktorit ei saa üle koormata.Destruktor võib tühistada.
KöitmineÜlekoormus saavutab varase sidumise.Ülimuslik viitab hilinenud sidumisele.

Ülekoormuse mõiste

Kompileerimisaja polümorfismi nimetatakse ülekoormuseks. Kuna ülekoormus tekib polümorfismi kontseptsioonist, pakub see „ühist liidest mitme meetodi jaoks”. See tähendab, et kui funktsioon on ülekoormatud, sisaldab see sama funktsiooni nime, kui see on uuesti defineeritud.

Ülekoormatud funktsioonid erinevad, sõltuvalt erinevatest „parameetrite (de) arvust või tüübist”, muudab see ühe ülekoormatud funktsiooni teisest. Sel viisil tuvastab kompilaator, millist ülekoormatud funktsiooni kutsutakse. Enamasti on ülekoormatud funktsioonid „konstruktorid”. „Kopeerija ehitaja” on „konstruktori ülekoormus”.

Ülekoormuse rakendamine C ++

 klassi ülekoormus {int a, b; avalik: int load (int x) {// esimene koormus () funktsioon a = x; tagastama a; } int koormus (int x, int y) {// teine ​​koormus () funktsioon a = x; b = y; tagastage a * b; }}; int main () {ülekoormus O1; O1.load (20); // esimese koormuse () funktsioonikõne O1.load (20, 40); // teise koormuse () funktsioonikõne} 

Siin on ülekoormatud klassi ülekoormuse funktsioonikoormus (). Klassi kahte ülekoormatud funktsiooni saab eristada selliselt, et esimese koormuse () funktsioon aktsepteerib ainult ühte täisarvu parameetrit, samas kui teine ​​koormus () funktsioon aktsepteerib kahte täisarvu parameetrit. Kui klassi ülekoormuse objekt nõuab koormuse () funktsiooni ühe parameetriga, saab esimese koormuse () funktsiooni. Kui objektikõnede koormust () läbivad kaks parameetrit, saab teise koorma () funktsiooni.

Ülekirjutamise mõiste

Kestusaja jooksul saavutatud polümorfismi nimetatakse "ülekaalukaks". See saavutatakse pärimise ja virtuaalsete funktsioonide abil. Ümberlülitatavale toimingule eelneb baasklassis „virtuaalne” märksõna ja tuletatud klassi uuesti määratlemata ilma igasuguse märksõnata.

Üks tähtsamaid asju, mida meeles pidada, on see, et ületatud funktsiooni prototüüp ei tohi muutuda, kui tuletatud klass seda uuesti määratleb. Kui üleantud funktsioonile antakse kõne, määrab C ++, millist funktsiooni versiooni nimetatakse kursoriga tähistatud objekti tüübi alusel, millega funktsiooni helistatakse.

Ülekaalutamise rakendamine C ++

 class base {public: virtual void funct () {// põhiklassi cout virtuaalne funktsioon << "See on baasklassi funktsioon (); }}; klassi tuletatud1: public base {public: void funct () {// põhiklassi virtuaalne funktsioon, mis on uuesti määratletud tuletatud1 klassi cout'is << "See on tuletatud1 klassi funktsioon ()"; }}; klass tuletatud2: avalik baas {public: void funct () {// põhiklassi virtuaalne funktsioon, mis on uuesti määratletud tuletatud 2 klassi väljal  toimib (); // tuletatud tuletatud klassi funktsiooni (). * p = & d2; p-> funct (); // kõne tuletatud2 klassi funktsionaalsusele (). tagastamine 0; } 

Siin on üks põhiklass, mis pärineb avalikult kahest tuletatud klassist. Virtuaalset funktsiooni määratletakse põhiklassis märksõna „virtuaalne” abil ja see on mõlema tuletatud klassi poolt ilma märksõnaga uuesti defineeritud. Põhiklassis () loob põhiklass pointeri muutuja 'p' ja objekti 'b'; "tuletatud1" klass loob objekti d1 ja tuletatud 2 klass loob objekti d2 '.

Algselt määratakse baasklassi 'p' kursorile algklassi objekti 'b' aadress. 'p' annab kõne funktsiooni funct (), seega kutsutakse põhiklassi funktsiooni. Seejärel määratakse tuletatud1 klassiobjekti 'd1' aadress pointerile 'p', see annab taas kõne funktsioneerimiseks (); siin täidetakse tuletatud1 klassi funktsioon funktsiooni (). Lõpuks omistatakse tuletatud2 klassi objektile pointer 'p'. Siis kutsub 'p' funktsiooni funct (), mis täidab tuletatud2 klassi funktsiooni func ().

Kui tuletatud1 / tuletatud2 klass ei funktsioneerinud uuesti (), siis oleks kutsutud põhiklassi funktsiooni (), kuna virtuaalne funktsioon on "hierarhiline".

Peamised erinevused ülekoormuse ja ülekaalukuse vahel

  1. Ülekoormatud funktsiooni prototüüp erineb ülekoormatud funktsioonile edastatava parameetri tüübi ja arvu poolest. Teisest küljest ei muutu ülekirjutatud funktsiooni prototüüp, sest ülekirjutatud funktsioon teostab erinevat klassi erinevat tegevust, kuid sama tüüpi ja parameetreid.
  2. Ülekoormatud funktsiooni nimi ei eelista ühtegi märksõna, samas kui ülalkirjeldatud funktsiooni nimi eelneb ainult põhiklassi võtmele „Virtual“.
  3. Millist ülekoormatud funktsiooni kasutatakse, sõltub funktsioonile edastatud parameetri tüübist või arvust. Selle klassi ülekirjutatud funktsioon sõltub sellest, millist klassi objekti aadressi on määratud kursorile, mis kutsus üles funktsiooni.
  4. Milline ülekoormatud funktsioon on kasutatav, lahendatakse kompileerimise ajal. Milline ületatav funktsioon, mida tuleb kasutada, lahendatakse runtime ajal.
  5. Konstruktoreid saab üle koormata, kuid neid ei saa ületada.
  6. Destruktoreid ei saa üle koormata, kuid neid saab tühistada.
  7. Ülekoormamine saavutab varase sidumise, mille puhul ülekoormatud funktsioon käivitatakse, lahendatakse kompileerimise ajal. Ülekaalutamisega saavutatakse hilinenud sidumine, kuna see, mida ületatakse, lahendatakse runtime ajal.

Sarnasused

  1. Mõlemaid rakendatakse klassi liikmete funktsioonidele.
  2. Polümorfism on mõlema põhiidee.
  3. Funktsiooninimi jääb samaks, kui rakendame ülekoormust ja funktsioone.

Järeldus

Ülekoormus ja ülekaalukus tunduvad sarnased, kuid see ei ole nii. Funktsioone saab ülekoormata, kuid iga klass ei saa tulevikus ülekoormatud funktsiooni uuesti määratleda. Virtuaalset funktsiooni ei saa üle koormata; neid saab tühistada.

Top