Co je virtuální třída?
Virtuální třída je třída, která je v paměti přidělena pouze jednou, takže děti této třídy používají pouze jednu kopii této nadřazené třídy, která je zřízena v paměti. Třída je skupina objektů, které sdílejí společné rysy nebo atributy. Vytvoření virtuální třídy dává objektově orientovaným programovacím jazykům schopnost používat vícenásobnou dědičnost, když jsou druhé nebo více generačních nadřazených tříd odvozeny od běžných základních předků. V závislosti na referenčním programovacím jazyce počítače se „virtuální“ klíčové slovo, podobné klíčové slovo nebo syntaxe a sémantika třídy používají k naznačení, že konkrétní třída má být považována za virtuální.
Ne všechny objektově orientované programovací jazyky umožňují vícenásobnou dědičnost, což je situace, kdy lze podřízenou třídu odvodit z více nadřazených tříd současně. V programovacím jazyce jako C ++ může třída zdědit všechna členská data a členské funkce z obou nadřazených tříd najednou a mít přístup k oběma sadám nadřazených dat a funkcí. Jiné jazyky, které podporují vícenásobnou dědičnost, zahrnují Perl, Python, Tcl a Eiffel.
Problém nastává ve více hierarchiích dědičnosti, když dvě nebo více tříd rodičů použitých k vytvoření podřízené třídy jsou původně odvozeny pouze od jedné nebo stejné prarodičské třídy. Tomu se říká diamantový problém, jméno pocházející z toho, jak by v této situaci vypadala hierarchie. Když se program kompilátoru pokusí vytvořit instanci třídy, jako je třída vnouče vytvořená ze dvou tříd rodičů se společným prarodičem, jsou v paměti vytvořeny dvě kopie prarodiče, jedna pro každého rodiče.
Kvůli dvojznačnosti způsobené více kopiemi stejného prarodiče v paměti, kompilátor není schopen zjistit, kterou kopii prarodiče by měl vnuk použít pro přístup k prarodičským datům nebo funkcím. Pro nápravu této situace je v C ++ prarodič přeměněn na virtuální třídu při deklaraci rodičů. To způsobí, že kompilátor vytvoří v paměti pouze jednu kopii prarodiče, kterou oba rodiče sdílejí. Jakmile se prarodič stane virtuální třídou, nemá kompilátor žádný problém rozhodovat o tom, jak má vnuk přistupovat k prarodiči, protože existuje pouze jedna kopie prarodiče.
Při strukturování hierarchií tříd by měla být věnována velká pozornost, zejména pokud budou v budoucnu zahrnuty nebo se stanou základem mnohem větších hierarchií. Správné využití virtuální třídy dává hierarchii třídy větší rozpětí ve vývoji; mají však potenciál způsobit chyby, které je obtížné najít. Studie spolehlivých principů počítačového programování pomůže zajistit, aby nenastaly neočekávané vedlejší účinky nesprávné organizace programů.