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í.

JINÉ JAZYKY

Pomohl vám tento článek? Děkuji za zpětnou vazbu Děkuji za zpětnou vazbu

Jak můžeme pomoci? Jak můžeme pomoci?