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

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

C ++ je nejčastěji známým počítačovým jazykem pro používání virtuální dědictví. Pro deklarování virtuální dědictví v C ++ se používá „virtuální“ klíčové slovo. Jak superclass, tak podtřída musí deklarovat virtuální metody pomocí „virtuálního“ klíčového slova. To říká kompilátoru C ++, že superclass je neúplná, a musí získat informace z podtřídy, aby jej dokončil. Použití podtřídy k dokončení super třídy neznamená, že se podtřídy navzájem přepínají, pokud majístejná základní třída a místo toho se kompilátor C ++ stará o určení, jaké kusy jdou s každým objektem.

Protože pro virtuální dědičnost je vyžadována virtuální základní třída, nelze globální funkce v C ++ deklarovat virtuální. Tento typ dědictví lze použít pouze při dodržování principů programování (OOP) s objektově orientovaným. Důvodem je to, že globální funkce nejsou spojeny s konkrétní třídou, a tak jsou obvykle samostatné sami. Bez dědičnosti superclass a podtřídy se nemůže stát, takže globální funkce a virtuální dědičnost se vzájemně vylučují. Globální funkce mohou být teoreticky použity uvnitř virtuálních funkcí, ale opak nemusí vždy fungovat.

Virtuální dědičnost se používá k vyřešení mnoha problémů s programováním a jedním z nejužitečnějších je řešení nejednoznačnosti. Ve více dědictví může mít základní třídu A, která má dvě podtřídy, B aC, a pak třída D, která zdědí z obou tříd B a C. Tento vzorec se běžně nazývá „diamant smrti“, protože pokud mají třídy A, B a C implementace stejné metody, není možné, aby třída D určila, kterou implementaci by měla 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á. Toto rozlišení je řešeno specializovanými interními objekty zvanými virtuálními tabulkami (vTables), které sledují každý typ objektu, ale tyto tabulky nemusí být výslovně manipulovány programátorem, 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?