Lisaks uurime erinevust ülekoormuse ja ülekaalukuse vahel võrdluskaardi abil.
Võrdluskaart:
Võrdluse alus | Ülekoormus | Ülekirjutamine |
---|---|---|
Prototüüp | Prototüü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 tegur | Parameetri 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ääratlemine | Funktsioon 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 aeg | Koosta aeg. | Käivitusaeg. |
Konstruktor / virtuaalne funktsioon | Konstruktoreid 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äljaltoimib (); // 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
- Ü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.
- Ülekoormatud funktsiooni nimi ei eelista ühtegi märksõna, samas kui ülalkirjeldatud funktsiooni nimi eelneb ainult põhiklassi võtmele „Virtual“.
- 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.
- Milline ülekoormatud funktsioon on kasutatav, lahendatakse kompileerimise ajal. Milline ületatav funktsioon, mida tuleb kasutada, lahendatakse runtime ajal.
- Konstruktoreid saab üle koormata, kuid neid ei saa ületada.
- Destruktoreid ei saa üle koormata, kuid neid saab tühistada.
- Ü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
- Mõlemaid rakendatakse klassi liikmete funktsioonidele.
- Polümorfism on mõlema põhiidee.
- 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.