Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Vícenásobná dědičnost v C++ - opakovaná dědičnost
14. března 2001, 00.00 | V tomto článku si povíme něco o dalším z problémů při vícenásobné dědičnosti - o opakovaném dědění.
V minulém článku jsem popsal vícenásobnou dědičnost, vyjmenoval problémy, které přináší a ukázal problém konfliktu jmen. V tomto článku objasním druhý problém - opakovanou dědičnost. Jak jsem uvedl minule, opakovaná dědičnost nastane, jestliže v třídním diagramu existuje mezi 2 třídami více, než jedna cesta. Tedy například:
|
Třídy B, C mají tribut int A zděděný z třídy A. Nyní vytvořme třídu D následovně:
|
Třída D obsahuje dva atributy int A . Vše je v pořádku jestliže z nějakého důvodu chceme mít atribut int A ve třídě D dvakrát. K atributům B::A a C::A potom přistupujeme jako při běžném konfliktu jmen, který jsem popsal v minulém článku. Zde je ale spíše logické chtít, aby atribut int A byl ve třídy D jen jednou, protože se vlastně jedná o jeden atribut A::A, který byl opakovaně zděděn.
Virtuální nadtřídaŘešením je udělat třídu A virtuální nadtřídou tříd B, C. K vyjádření virtuální nadtřídy se používá klíčové slovo virtual , které známe jako slovo deklarující metodu volanou pozdní vazbou. "Virtuální dědění" nemá s pozdní vazbou nic společného. Opět vidíme v C++ situaci, kdy jedno klíčové slovo má více významů. Opravíme zdrojový text takto:
|
Nyní má třída D skutečně jen jeden atribut int A . Ještě jen upozorním, že všichni další potomci tříd B a C budou dědění virtuálně. Velkou nevýhodou virtuálního dědění je fakt, že pro virtuální dědičnost se musím rozhodnout dříve, než dojde k vícenásobnému dědění. Tedy když jsem v mém příkladě vytvářel třídy B a C, už jsem musel počítat s tím, že bude existovat nějaká třída D, u které nastane problém opakovaného dědění. Jinak bych u jednoduché dědičnosti nepoužil klíčové slovo virtual. Není příliš dobré preventivně u každé dědičnosti použít klíčové slovo virtual, protože třída, která má virtuální nadtřídu obsahuje navíc ještě jeden ukazatel. Takže třída class B1 : public A není stejná jako třída class B2 : virtual public A . Onen zmiňovaný ukazatel není ukazatelem na tabulku virtuálních metod. Jedná se o ukazatel, který bude nutný pro sdílení prvků třídy při opakované vícenásobné dědičnosti.
Právě problémy s virtuálním děděním jsou velmi silným argumentem odpůrců vícenásobné dědičnosti. Používáte-li vícenásobnou dědičnost, doporučuji Vám vyhnout se virtuálnímu dědění a všem problémům, které přináší. V příštím článku dokončíme téma vícenásobné dědičnosti přehledem pravidel pro vytváření a likvidování instancí tříd vyniklých vícenásobnou dědičností. Tedy povíme si, v jakém pořadí se volají konstruktory a destruktory při vícenásobné dědičnosti.
Obsah seriálu (více o seriálu):
- Základy OOP v C++: Od C k C++
- Základní pojmy objektově orientovaného programování
- Vytváření tříd, instance třídy, zasílání zpráv v C++
- Vytváření instancí - konstruktory, destruktory
- Kopírovací konstruktor v C++
- Jednoduchá dědičnost v C++
- Časná versus pozdní vazba - úvod do polymorfismu v C++
- Polymorfismus - dokončení
- Vícenásobná dědičnost v C++
- Vícenásobná dědičnost v C++ - opakovaná dědičnost
- Vícenásobná dědičnost v C++ - volání konstruktorů a destruktorů
- Přetěžování operátorů v C++ 1.díl
- Přetěžování operátorů v C++ 2. díl
- Vstupní a výstupní operace pomocí datových proudů v C++
- Přetěžování operátorů << a >> pro datové proudy v C++
- Neformátovaný vstup a výstup v C++
- Paměťové proudy v C++
- Prostory jmen v C++
- Řetězce v C++
- Výjimky v C++
- Výjimky v C++ - výjimky tvoří dědičnou hierarchii
- Výjimky v C++ - dokončení
- Dynamická identifikace typů v C++
- Přetypování v C++
- Problémy s typy při vícenásobné dědičnosti
- Šablony funkcí v C++
- Šablony datových typů v C++
- Vnitřní typy u parametrů šablon, vnořené šablony v C++
- Pole s libovolným intervalem indexování v C++
- Datové kontejnery v C++ - Úvod do STL
- Vector - datový kontejner v C++
- Iterátory v C++
- Šablona vector v C++ a iterátory
- Asociativní pole v C++
- Množina v C++
- Funkční objekty v C++
- Standardní funkční objekty v C++
- Úvod do standardních algoritmů v C++
- Kopírovací a přesouvací algoritmy v C++
- Vyhledávací algoritmy v C++
- Skenovací (prohlížecí) algoritmy v C++
- Transformační algoritmy v C++
- Řadící algoritmy v C++
- Halda v C++
- Standardní algoritmy v C++ - dokončení
- Automatické ukazatele v C++
- Inteligentní ukazatel - čítač referencí v C++
- Použití čítače referencí v C++
- Kopírování velkých objektů v C++
- Řízené kopírování prvků v poli v C++
- Dokončení seriálu objektově orientované programování v C++
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007