Skip to main content

Co je to virtuální dědictví?

Virtuální dědičnost je typ dědičnosti, ve kterém je implementace superclasy 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ědičnosti.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í superclasy neznamená, že se podtřídy navzájem přepínají, pokud mají stejnou základní třídu, a místo toho se kompilátor C ++ stará o určení, jaké kusy jdou s každým objektem.Dědičnost, globální funkce v C ++ nelze 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žívány uvnitř virtuálních funkcí, ale opak nemusí vždy fungovat.Ve vícenásobném dědictví může mít základní třídu A, která má dvě podtřídy, B a C, a pak třídu D, která zdědí z obou tříd B a C. Tento vzorec se běžně nazývá diamant smrti, protože pokud jsou třídy A, B,, B,a C všechny mají 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 každá implementace tříd 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.