Rozdíl mezi virtuální a čistou virtuální funkcí

Autor: Laura McKinney
Datum Vytvoření: 2 Duben 2021
Datum Aktualizace: 13 Smět 2024
Anonim
Rozdíl mezi virtuální a čistou virtuální funkcí - Technologie
Rozdíl mezi virtuální a čistou virtuální funkcí - Technologie

Obsah


Virtuální funkce i čistě virtuální funkce jsou koncepty polymorfismu runtime. Hlavní rozdíl mezi ‘virtuální funkce a „Čistě virtuální funkce“ je, že „virtuální funkce“ má svou definici v základní třídě a také zděděné odvozené třídy ji předefinují. Čistá virtuální funkce nemá v základní třídě definici a všechny odvozené třídy ji musí předefinovat.

Virtuální funkce je však také nazývána jako dynamický dispečer a běhový dispečink, protože volána funkce je specifikována v běhovém čase podle typu použitého objektu.

Polymorfismus je podporován jazyky C ++ a Java. V Javě se místo „virtuální funkce“ používá výraz „overriding“, protože virtuální funkce je termín C ++.

  1. Srovnávací tabulka
  2. Definice
  3. Klíčové rozdíly
  4. Závěr

Srovnávací tabulka

Základ pro srovnáníVirtuální funkceČistá virtuální funkce
ZákladníVirtuální funkce má svou definici v základní třídě.Funkce Pure Virtual Function nemá v základní třídě definici.
Prohlášenívirtual funct_name (parametr_list) {. . . . .};virtual funct_name (parametr_list) = 0;
Odvozená třídaVšechny odvozené třídy mohou nebo nemusí přepsat virtuální funkci základní třídy.Všechny odvozené třídy musí přepsat virtuální funkci základní třídy.
Účinek

Virtuální funkce jsou svou povahou hierarchické; neovlivní kompilaci, pokud odvozené třídy nepřepíší virtuální funkci základní třídy.Pokud všechny odvozené třídy nedokážou přepsat virtuální funkci základní třídy, dojde k chybě kompilace.
Abstraktní třídaŽádný koncept.Pokud třída obsahuje alespoň jednu čistě virtuální funkci, je deklarována jako abstraktní.


Definice virtuální funkce

virtuální funkce je členská funkce základní třídy a je nově definována odvozenými třídami, které dědí základní třídu. Není nutné, aby všechny odvozené třídy musely předefinovat virtuální funkci, je předefinována pouze těmi odvozenými třídami, které mohou vyžadovat její fungování. Virtuální funkce je vytvořena deklarováním funkce v základní třídě předcházející klíčovému slovu 'virtuální'.

Prohlášení:

class base {public: virtual type funt_name (seznam parametrů) {. . . }};

Zděděné odvozené třídy mohou předefinovat virtuální funkci bez jakéhokoli klíčového slova „virtuální“. Odvozené třídy předefinují virtuální funkci tak, aby splnila svůj úkol. Protože je virtuální funkce předefinována ve odvozených třídách, máme více forem stejné funkce. Nyní, která verze funkce je volána, záleží na tom, jaký druh objektu je vyvolán touto funkcí.


Víceúrovňové dědictví

Ve víceúrovňové dědičnosti, kde lze odvozenou třídu, která zdědila virtuální funkci od své základní třídy, i když je sama použita jako základní třída pro jinou odvozenou třídu, může být virtuální funkce stále přepsána. Když je tedy virtuální funkce zděděna, je zděděna i její virtuální povaha.

Virtuální funkce jsou také svou povahou hierarchické, tj. Pokud odvozená třída nepřepíše / nadefinuje virtuální funkci zděděnou ze základní třídy a když objekt odvozené třídy vyvolá tuto virtuální funkci, vyvolá se virtuální funkce definovaná základní třídou.

Definice čisté virtuální funkce

Jak je vidět výše, pokud odvozená třída nepřepíše virtuální funkci, použije se virtuální funkce definovaná základní třídou. Co když ale samotná základní třída nedefinuje virtuální funkci. Základní třída mnohokrát nemá žádnou definici virtuální funkce, nebo někdy chcete, aby všechny odvozené třídy musely virtuální funkci přepsat.

Pro řešení těchto dvou situací podporuje C ++ koncept „Čistá virtuální funkce“. „Čistá virtuální funkce“ je deklarována v základní třídě, ale nemá definici v základní třídě. Čistá virtuální funkce je deklarována následovně.

virtuální typ funct_name (parametr_list) = 0;

Kdykoli je virtuální funkce v základní třídě vytvořena jako „čistá“, musí každá odvozená třída povinně přepsat čistou virtuální funkci základní třídy. Pokud odvozená třída nedokáže přepsat čistě virtuální funkci základní třídy, bude to mít za následek chybu kompilace.

Abstraktní třída

Třída, která obsahuje alespoň jednu čistou funkci, se nazývá „abstraktní třída“. Žádné objekty abstraktních tříd nelze vytvořit, ale můžete vytvořit odkazy a ukazatele na abstraktní třídy. K členům abstraktních tříd lze přistupovat prostřednictvím objektu odvozených tříd, které zdědí abstraktní základní třídu.

Třídu, kterou chcete deklarovat, použijte klíčové slovo 'abstraktní' Před 'třída' klíčové slovo.

// například abstraktní třída class-name {. . virtuální typ funct_name (parametr_list) = 0; . . };

  1. Virtuální funkce jsou rozhodně definovány v základní třídě a předefinovány (přepsány) v odvozené třídě. Na druhou stranu, čistě virtuální funkce, základní třída není v základní třídě definována
  2. Odvozená třída v případě potřeby předefinuje (přepíše) virtuální funkci, zatímco v případě čisté virtuální funkce musí odvozená třída definitivně předefinovat čistou virtuální funkci.
  3. Pokud odvozená třída nedokáže předefinovat (přepsat) virtuální funkci, může použít virtuální funkci základní třídy. Naopak, pokud odvozená třída nedokáže přepsat čistě virtuální funkci, dojde k chybě kompilace.
  4. Základní třída obsahující virtuální funkci může být instalována, tj. Může být vytvořen její objekt. Naproti tomu základní třída obsahující čistě virtuální funkci, tj. Abstraktní třída, nemůže být instancována, protože abstraktní třída není plně definována.

Poznámka:
Prototyp „virtuální funkce“ a „čisté virtuální funkce“ zůstává v celém programu stejný.

Závěr:

„Virtuální funkce“ i „čistě virtuální funkce“ mají svůj význam, protože ve „virtuálních funkcích“ nemusí všechny odvozené třídy předefinovat virtuální funkci a tam, kde chceme, aby všechny odvozené třídy předefinovaly virtuální funkci, čistě virtuální tam funguje nejlépe.