Különbség a virtuális és a tiszta virtuális funkció között

Szerző: Laura McKinney
A Teremtés Dátuma: 2 Április 2021
Frissítés Dátuma: 10 Lehet 2024
Anonim
Különbség a virtuális és a tiszta virtuális funkció között - Technológia
Különbség a virtuális és a tiszta virtuális funkció között - Technológia

Tartalom


A virtuális függvény és a tiszta virtuális függvény egyaránt a futási idő polimorfizmusának fogalma. A fő különbség a „virtuális funkció ” és „Tiszta virtuális funkció” az, hogy a „virtuális függvény” meghatározása az alaposztályban van, és az örökölt származtatott osztályok újradefiniálják. A tiszta virtuális függvénynek nincs meghatározása az alaposztályban, és az összes öröklött származtatott osztálynak újra meghatároznia kell.

Ugyanakkor a virtuális funkciót dinamikus disztribúciónak és futásidejű disztribúciónak is nevezzük, mivel a meghívott függvény a futási időben kerül meghatározásra, a használt objektum típusának megfelelően.


A polimorfizmust mind a C ++, mind a Java nyelv támogatja. A Java-ban a „felülbírálás” kifejezést használják a „virtuális funkció” helyett, mivel a virtuális funkció a C ++ kifejezés.

  1. Összehasonlító táblázat
  2. Meghatározás
  3. Főbb különbségek
  4. Következtetés

Összehasonlító táblázat

Az összehasonlítás alapjaVirtuális funkcióTiszta virtuális funkció
AlapvetőA virtuális függvény meghatározása az alaposztályban található.A tiszta virtuális függvénynek nincs meghatározása az alaposztályban.
Nyilatkozatvirtuális funct_name (paraméter_lista) {. . . . .};virtuális funct_name (paraméter_lista) = 0;
Származtatott osztályAz összes származtatott osztály felülbírálhatja vagy nem módosíthatja az alap osztály virtuális funkcióját.Minden származtatott osztálynak felül kell írnia az alaposztály virtuális funkcióját.
Hatás

A virtuális funkciók hierarchikus jellegűek; ez nem befolyásolja az összeállítást, ha bármelyik származtatott osztály nem felülírja az alaposztály virtuális funkcióját.Ha az összes származtatott osztály nem felülbírálja az alaposztály virtuális funkcióját, akkor fordítási hiba lép fel.
Absztrakt osztályNincs koncepció.Ha egy osztály legalább egy tiszta virtuális funkciót tartalmaz, akkor azt elvontnak kell nyilvánítani.


A virtuális funkció meghatározása

A virtuális funkció az alap osztály tagfüggvénye, és újra meghatározza azt a származtatott osztályokkal, amely az alap osztályt örököli. Nem szükséges, hogy az örökölt származtatott osztályok újradefiniálják a virtuális függvényt, csak azokat a származtatott osztályokat kell újradefiniálni, amelyek megkövetelhetik annak működését. Virtuális függvényt úgy hozunk létre, hogy a függvényt a kulcsszó előtti alaposztályban deklaráljuk „Virtuális”.

Nyilatkozat :

osztálybázis {public: virtuális típus funt_name (paraméterlista) {. . . }};

Az örökölt származtatott osztályok virtuális kulcsszó nélkül újradefiniálhatják a virtuális funkciót. A származtatott osztályok újradefiniálják a virtuális függvényt annak elvégzéséhez. Mivel a virtuális függvényt újradefiniáljuk származtatott osztályokban, ugyanazon függvény több formája van. Most, hogy a függvény melyik verzióját hívják, attól függ, hogy milyen objektumra hivatkoznak arra a funkcióra.

Többszintű öröklés

Többszintű öröklés esetén, amikor egy olyan származtatott osztály, amely a virtuális funkciót az alaposztálytól örökölte, amikor maga egy másik származtatott osztály alaposztályaként kerül felhasználásra, a virtuális függvény továbbra is felülbírálható. Tehát, ha egy virtuális függvényt öröklünk, akkor annak a virtuális jellege is örökölhető.

A virtuális funkciók szintén hierarchikus jellegűek, azaz ha egy származtatott osztály nem felülírja / újradefiniálja az alaposztálytól örökölt virtuális függvényt, és ha a származtatott osztály objektuma meghívja ezt a virtuális funkciót, akkor az alaposztály által meghatározott virtuális függvényt hívják meg.

A tiszta virtuális funkció meghatározása

Mint fentebb láttuk, ha a származtatott osztály nem felülbírálja a virtuális függvényt, akkor az alaposztály által meghatározott virtuális függvényt használjuk. Mi lenne, ha maga az alaposztály nem határozza meg a virtuális funkciót. Sokszor az alaposztálynak nincs meghatározása a virtuális függvényre, vagy néha azt akarja, hogy az összes származtatott osztály felülírja a virtuális funkciót.

A fenti két helyzet kezelésére a C ++ támogatja a „Tiszta virtuális funkció„. A „tiszta virtuális függvényt” az alaposztályban deklarálják, de az alaposztályban nincs meghatározása. A tiszta virtuális függvényt a következőképpen deklaráljuk.

funct_name virtuális típus (paraméter_lista) = 0;

Amikor az alaposztály virtuális függvényét „tisztavá” teszik, akkor minden származtatott osztálynak kötelezően felül kell írnia az alaposztály tiszta virtuális funkcióját. Ha a származtatott osztály nem bírálja felül az alap osztály tiszta virtuális funkcióját, akkor fordítási hibát fog eredményezni.

Absztrakt osztály

Az osztály, amely legalább egy tiszta funkciót tartalmaz, elvont osztálynak nevezi. Az absztrakt osztályok objektumait nem lehet létrehozni, de hivatkozásokat és mutatókat hozhat létre az absztrakt osztályokhoz. Az absztrakt osztályok tagjai a származtatott osztályok azon objektumán keresztül érhetők el, amely az absztrakt alaposztályt örököli.

Használjon egy kulcsszót egy olyan osztályhoz, amelyet absztraktnak kíván kijelenteni 'absztrakt' előtt 'osztály' kulcsszó.

// például elvont osztály osztálynév {. . funct_name virtuális típus (paraméter_lista) = 0; . . };

  1. A virtuális funkciókat határozottan meghatározzuk az alaposztályban, és újradefiniáljuk (felülbíráljuk) a származtatott osztályban. Másrészről, a tiszta virtuális függvényt az alaposztály különösen nem határozza meg
  2. A származtatott osztály szükség esetén újradefiniálja (felülbírálja) a virtuális függvényt, míg a tiszta virtuális függvény esetében a származtatott osztálynak határozottan újra kell definiálnia a tiszta virtuális funkciót.
  3. Ha a származtatott osztály nem tudja újradefiniálni (felülbírálni) a virtuális funkciót, akkor felhasználhatja az alaposztály virtuális függvényét. Ezzel szemben, ha egy származtatott osztály nem felülírja a tiszta virtuális függvényt, akkor fordítási hiba lép fel.
  4. A virtuális függvényt tartalmazó alaposztályt meg lehet valósítani, azaz az objektuma létrehozható. Ezzel szemben a tiszta virtuális funkciót tartalmazó alaposztály, azaz egy absztrakt osztály nem váltható ki, mivel az absztrakt osztály nincs teljesen meghatározva.

Jegyzet:
A „virtuális funkció” és a „tiszta virtuális funkció” prototípusa változatlan marad az egész programban.

Következtetés:

A 'virtuális funkciók' és a 'tiszta virtuális függvény' egyaránt jelentőséggel bírnak, mivel a "virtuális funkciókban" az összes származtatott osztálynak nem kell újradefiniálnia a virtuális funkciót, és ahol azt akarjuk, hogy az összes származtatott osztály újradefiniálja a virtuális funkciót, a tiszta virtuális funkciót a funkció a legjobban ott érvényes.