Co je to virtuální funkce?
Virtuální funkce je funkce, definovaná 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 - nebo přepsána, v závislosti na tom, zda byla funkce definována v superclass.
Virtuální funkce lze definovat 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 HAJe to nějaké implementace, i když to 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 však podléhají stejným dědičným pravidlem jako 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á deklaruje virtuální funkci, která je implementována v podtřídě B. Třída B má vlastní podtřídu, třída C C. C. C. Class C nevyžaduje explicitní definici funkce třídy A, protože zdědí definici z třídy B, pokud je to nutné, může třída C přepsat funkci třídy B, “Nebo by to mohlo přepsat funkci třídy B a zároveň ji volat.
V ostatních extrémních, virtuálních funkcích nemusí být definovány v podtřídě, pokud jsou v této podtřídě deklarovány 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.
třídy B až G musí mít virtuální funkci třídy A nějak definované. Pokud má třída B implementaci funkce A, třídy D a E nepotřebují, aby byly přepracovány. Možná, že podtřídy C musí implementovat funkci A, 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 funkce deklarována virtuální ve třídě C a implementace není nutná.
Virtuální funkce mohou být skličující, aby se naučily, ale pokud jsou používány správně, mohou snížit duplicitu kódu a usnadnit porozumění kóduobecně. Existuje však mnoho úskalí s virtuálními funkcemi, zejména pokud jde o vícenásobné dědictví. Ve vícenásobném dědictví je možné, že nejednoznačně definované virtuální funkce, které by se navzájem vnímaly, by měly být v tomto kontextu použito s opatrností.