Ajánlott, 2024

Szerkesztő Választása

Különbség a funkció túlterhelés és a felülbírálás között C ++-ban

A polimorfizmus az OOP egyik legfontosabb jellemzője. Ez egyszerűen azt jelenti, hogy „egy nevet használ több űrlapra”. A polimorfizmus megvalósítható a „funkció túlterhelés”, az „operátor túlterhelés” és a „virtuális funkció” használatával. Mind a „túlterhelés”, mind a „felülbírálás” a polimorfizmus fogalmát jelenti. Itt a "túlterhelés" a fordítási idő polimorfizmusa, és a "felülbírálás" a futási idő polimorfizmusa. További tanulás, ha a túlterhelés és a felülbírálás terén tapasztalható fő különbségről beszélünk. A „túlterhelésben” a túlterhelt függvényeket ugyanazzal a függvénynévvel definiáljuk, de különböző paraméterek és típusok. A felülbírált függvény „felülíró” prototípusában ugyanaz az egész program, de a felülbírálandó függvényt a „virtuális” kulcsszó előzi meg, és a származtatott osztály újra definiálja kulcsszó nélkül.

Továbbá összehasonlító táblázat segítségével vizsgáljuk a túlterhelés és a felülbírálás közötti különbséget.


Összehasonlító táblázat:

Az összehasonlítás alapjaA túlterhelésnyomós
PrototípusA prototípus különbözik, mivel a paraméterek száma vagy típusa eltérő lehet.A prototípus minden aspektusának azonosnak kell lennie.
KulcsszóNincs kulcsszó a túlterhelés során.A felülbírálandó függvényt a „virtuális” kulcsszó követi az alaposztályban.
Megkülönböztető tényezőA paraméterek száma vagy típusa különbözik attól, ami meghatározza a függvény verziót.Melyik osztály funkcióját a mutató hívja meg, melyik osztály címét hozzárendeli az adott mutatóhoz.
Minta meghatározásaA függvényt ugyanazzal a névvel definiáljuk, de a paraméterek száma és típusa eltérő.A függvényt definiáljuk, amelyet a kulcskategóriában egy „virtuális” kulcsszó követ, és újból definiálva származtatott osztályból a kulcsszó nélkül.
A teljesítés idejeFordítási idő.Futtatási idő.
Konstruktor / virtuális funkcióA konstruktorok túlterhelhetők.A virtuális funkció felülbírálható.
Pusztító
A destruktort nem lehet túlterhelni.A romboló felülbírálható.
KötésA túlterhelés korai kötést eredményez.A felülbírálás késedelmes kötést jelent.

A túlterhelés meghatározása

A fordítási idő polimorfizmusát „túlterhelésnek” nevezzük. Mivel a túlterhelés a polimorfizmus fogalmából származik, „egy közös felületet biztosít több módszerhez”. Ez azt jelenti, hogy ha egy függvény túlterhelt, akkor ugyanaz a függvénynév szerepel, amíg újra definiálják.

A túlterhelt függvények különböznek a különböző „számok vagy paraméterek” típusától függően, és egy túlterhelt funkciót különböztet meg a másiktól. Ily módon a fordító felismeri, hogy melyik túlterhelt funkciót hívják. A leggyakrabban túlterhelt funkciók „konstruktorok”. A „Másolatot készítő” egyfajta „kivitelező túlterhelés”.

A túlterhelés megvalósítása C ++-ban

 osztály túlterhelés {int a, b; nyilvános: int load (int x) {// első terhelés () függvény a = x; vissza a; } int terhelés (int x, int y) {// második terhelés () függvény a = x; b = y; vissza a * b; }}; int main () {O1 túlterhelés; O1.load (20); // első terhelés () függvényhívás O1.load (20, 40); // második terhelés () függvényhívás} 

Itt az osztály túlterhelés funkcióterhelése () túlterhelt. Az osztály két túlterhelt funkcióját úgy lehet megkülönböztetni, hogy az első terhelés () függvény csak egyetlen egész paramétert fogad el, míg a második terhelési () függvény két egész szám paramétert fogad el. Amikor az osztály túlterhelés tárgya egyetlen paraméterrel hívja a terhelés () függvényt, az első terhelés () függvényt hívják. Ha az objektum hívja a terhelés () függvényt két paraméteren át, a második terhelés () függvényt hívják.

A felülbírálás meghatározása

A futásidő alatt elért polimorfizmust „felülírónak” nevezik. Ez az „öröklés” és a „virtuális funkciók” segítségével valósítható meg. A felülbírálandó függvényt egy „virtuális” kulcsszó előzi meg egy bázisosztályban, és újra definiálják egy származtatott osztályban kulcsszó nélkül.

A felülbírálás esetén az egyik legfontosabb dolog, hogy a felülbírált funkció prototípusa nem változhat, míg a származtatott osztály újra definiálja azt. Ha a felülbírált függvény hívást kap, a C ++ határozza meg, hogy a függvény melyik verzióját hívják meg a mutató által kijelölt objektum típusa alapján, amellyel a függvényhívás megtörténik.

A felülbírálás végrehajtása a C ++-ban

 class base {public: virtual void funct () {// bázisosztály virtuális funkciója << "Ez egy alaposztály funkciója ()"; }}; osztályból származtatott1: public base {public: void funct () {// az alaposztály virtuális függvénye, amely újból lett meghatározva a származtatott 1 osztályú cout-ban << "Ez egy származtatott1 osztály funkciója ()"; }}; osztályból származtatott2: nyilvános bázis {public: void funct () {// az alaposztály virtuális funkciója, amelyet újból definiált a származtatott 2 osztályban  funct (); // hívás származtatott1 osztályfüggvényre (). * P = & D2; p-> funct (); // hívás származtatott 2 osztályfüggvényre (). vissza 0; } 

Itt van egy bázisosztály, amely nyilvánosan örökölt két származtatott osztályból. A virtuális függvényt egy „virtuális” kulcsszóval határozza meg, és mindkét származtatott osztály kulcsszó nélkül újradefiniálja azt. A fő () esetében az alaposztály egy „p” mutatót és egy „b” objektumot hoz létre; A „származtatott1” osztály létrehoz egy d1 objektumot, és a kapott 2 osztály létrehoz egy d2 'objektumot.

Most kezdetben a 'b' alaposztály objektum címe a 'p' bázisosztály mutatójához van hozzárendelve. A „p” hívja a függvény függvényt (), így az alaposztály függvénye. Ekkor a 'd1' származtatott1 osztályobjektum címét a 'p' mutatóhoz rendeli, ismét meghívást ad a (); itt az eredő1 osztály függvénye () végrehajtódik. Végül a 'p' mutató hozzárendelve van a származtatott 2 osztály objektumához. Ezután a 'p' hívja a függvény függvényt (), amely a (2) függvény () függvényét hajtja végre.

Ha a származtatott1 / származtatott2 osztály nem definiálta újra a (z) függvényt, akkor az alaposztály függvénye () lett volna hívva, mivel a virtuális függvény hierarchikus.

Főbb különbségek a túlterhelés és a felülbírálás között

  1. A túlterhelt függvény prototípusa a túlterhelt funkcióhoz továbbított paraméter típusától és számától függ. Másrészről a felülbírált függvény prototípusa nem változik, mert egy felülbírált funkció különböző műveleteket hajt végre különböző osztályokhoz, de ugyanolyan típusú és számú paraméterrel rendelkezik.
  2. A túlterhelt függvény neve nem előz meg semmilyen kulcsszót, míg a felülbírált függvény neve csak a „virtuális” kulccsal kezdődik csak az alaposztályban.
  3. A túlterhelt függvény függ a függvényhez továbbított paraméter típusától vagy számától. A felülvizsgált függvény, amelyik osztályát meghívja, attól függ, hogy melyik osztály objektum címe van hozzárendelve a mutatóhoz.
  4. Melyik túlterhelt függvényt kell meghívni a fordítási idő alatt. Melyik felülbírálható funkciót kell megoldani a futás közben.
  5. A konstruktorok túlterhelhetők, de nem felülírhatók.
  6. A megsemmisítők nem túlterhelhetők, de felülbírálhatók.
  7. A túlterhelés korai kötést ér el, amellyel a túlterhelt függvényt lekérdezzük a fordítási idő alatt. A felülbírálás késedelmes kötést ér el, mivel a felülbírált függvényt a futás közben megoldjuk.

Hasonlóságok

  1. Mindkettőt egy osztály tagfüggvényeire alkalmazzák.
  2. A polimorfizmus az alapfogalom mindkettőjük mögött.
  3. A függvény neve ugyanaz marad, miközben túlterhelést alkalmazunk, és felülbíráljuk a funkciókat.

Következtetés

A túlterhelés és a felülbírálás hasonlónak tűnik, de ez nem így van. A függvények túlterhelhetők, de bármely osztály nem tudja tovább meghatározni a túlterhelt funkciót a jövőben. A virtuális funkciót nem lehet túlterhelni; csak felülbírálhatók.

Top