Co je virtuální dědičnost?

Virtuální dědičnost je typ dědičnosti, ve kterém je implementace nadřazené třídy neúplná a pro úplnou definici objektu je vyžadována podtřída. Tento typ dědičnosti může být použit ve spojení s jednoduchou i vícenásobnou dědičností, ale nejčastěji se používá u vícenásobné dědičnosti. Jakákoli třída zděděná z virtuální základní třídy se stane přímou podtřídou této základní třídy. Virtuální základní třída se může při implementaci všech svých metod spoléhat na podtřídu, není to však požadavek.

C ++ je nejčastěji známý počítačový jazyk, který používá virtuální dědičnost. K deklaraci virtuální dědičnosti v C ++ se používá klíčové slovo „virtuální“. Nadřazená i podtřída musí deklarovat virtuální metody pomocí klíčového slova „virtuální“. To říká kompilátoru C ++, že nadtřída je neúplná a pro její dokončení musí získat informace z podtřídy. Použití podtřídy k dokončení nadřazené třídy neznamená, že se podtřídy přepíší, pokud mají stejnou základní třídu, a kompilátor C ++ se místo toho postará o určení, jaké kousky jdou s každým objektem.

Protože virtuální virtuální třída je vyžadována pro virtuální dědičnost, nelze globální funkce v C ++ deklarovat jako virtuální. Tento typ dědičnosti lze použít pouze při dodržování principů objektově orientovaného programování (OOP). Důvodem je to, že globální funkce nejsou spojeny s konkrétní třídou, a tak jsou obvykle samy o sobě obsaženy. Bez nadřazené třídy a podtřídy nemůže dojít k dědičnosti, takže globální funkce a virtuální dědičnost se vzájemně vylučují. Globální funkce lze teoreticky použít uvnitř virtuálních funkcí, ale zpětný chod nemusí vždy fungovat.

Virtuální dědičnost se používá k řešení mnoha problémů s programováním a jedním z nejužitečnějších je řešení dvojznačnosti. Ve vícenásobném dědictví může mít základní třída A, která má dvě podtřídy, B a C, a pak třída D, která zdědí obě třídy B a C. Tento vzorec se běžně nazývá „diamant smrti“, protože pokud třídy A, B a C mají implementace stejné metody, není možné, aby třída D určila, kterou implementaci má použít. Virtuální dědičnost řeší tento problém, protože implementace každé třídy zůstává odlišná, a proto jednoznačná. Tento rozdíl je zpracováván specializovanými interními objekty zvanými virtuální tabulky (vtables), které sledují každý typ objektu, ale tyto tabulky nemusí být programátorem explicitně manipulovány, protože jsou zabudovány do jazyka.

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?