Skip to main content

Co je to virtuální funkce?

Virtuální funkce je funkce, definována v superclass, která musí být přítomna v podtřídě, aby tato podtřída měla úplnou definici třídy.Virtuální funkce se spoléhají na objektově orientované programovací paradigma zvané virtuální dědičnost, která je nejčastěji vidět v C ++ pomocí virtuálního klíčového slova.Pro definování virtuální funkce jsou nutné dvě třídy, superclass a podtřída.Superclass je místo, kde je funkce poprvé deklarována a možná definována.Podtřída je tam, kde je funkce definována mdash;nebo přepsán, v závislosti na tom, zda byla funkce definována v superclass.

Virtuální funkce může být definována jedním ze dvou způsobů.Za prvé, může být definována jako pahýl, ve kterém má prázdné tělo a nedělá nic.Za druhé, může být definována jako čistá virtuální funkce, kde je definována jako null v souboru záhlaví superclass.

Existují výhody a nevýhody obou metodik.Definování funkce jako pahýlu zajišťuje, že všechny podtřídy mají nějakou implementaci, i když nic nedělá.Pokud člověk zapomene přepsat funkci a správně ji implementovat v podtřídě, zdá se však, že to nedokáže poukazovat na žádné chyby ani varování.Na druhé straně definování čisté virtuální funkce vyžaduje, aby každá podtřída měla svou vlastní definici funkce a chyby se objeví, pokud tomu tak není.Virtuální funkce, takže hierarchie dědictví s více než dvěma úrovněmi nemusí vyžadovat explicitní definice virtuálních funkcí.Například lze zvážit třídu A, která prohlašuje virtuální funkci, která je implementována v podtřídě B. Třída B má vlastní podtřídu, třída C C. C. C. C. Třída C nevyžaduje jako funkci explicitní definici třídy, protože zdědí, protože zdědíDefinice z třídy B. V případě potřeby by třída C mohla přepsat funkci třídy BS, nebo by mohla přepsat funkci třídy BS a zároveň ji volat.

V jiných extrémních, virtuálních funkcích nemusí být definovány v podtřídě, pokud jsou v této podtřídě prohlášeny za virtuální.Například lze zvážit třídu A, která prohlašuje virtuální funkci a má navíc dvě podtřídy, B a C.B až G vše musí mít třídu jako virtuální funkce definovaná nějak.Pokud má třída B implementaci funkce AS, třídy D a E Don't to, aby byly přepracovány.Možná, že podtřídy CS musí implementovat jako funkci, ale oba dělají něco jiného, takže definování funkce v samotné třídě C by nebylo užitečné.V takovém případě může být tato funkce deklarována virtuální ve třídě C a implementace není nutná..Existuje však mnoho úskalí s virtuálními funkcemi, zejména pokud jde o vícenásobné dědictví.Ve více dědictví je možné, že nejednoznačně definované virtuální funkce, které by se navzájem v rozporu, měly být v tomto kontextu použito s opatrností.