Dědění, volání konstruktorů a destruktorů, virtuální a nevirtuální metody



1) Vytvořte bázovou třídu CBase, která bude mít metodu Print, která vytiskne text Cbase.
Vytvořte v ní konstruktor - implicitní a destruktor.
Konstruktor bude tisknout Konstr_CBase, destruktor vytiskne Destr_CBase.

2) Vytvořte odvozenou třídu CDeriv1 od CBase pomocí public dědění, která bude mít totéž.
Bude tisknout "CDeriv1".
Obdobně budou tisknout i konstruktor a destruktor.

3) Vytvořte odvozenou třídu CDeriv2 od CBase pomocí public dědění, která bude mít totéž.
Bude tisknout "Cderiv2".
Tato třída bude mít jeden prvek třídy Cderiv1.
Obdobně budou tisknout i konstruktor a destruktor.

4) Vytvořte v main jeden objekt od každé třídy.
Zavolejte jeho metodu Print.
Spusťte a podívejte se co se tiskne - kudy prochází program.

5) Vytvořte v main pole pro tři ukazatele pb,pd1,pd2 na každou třídu (typ třídy) a nainicializujte je pomocí vytvořených prvků (všechny stejně => vzniknou všechny kombinace tříd ukazatelů a objektů).

CBase *pb[3] = {&b,&d1,&d2};
CDerived1 *pd1[3] = {(CDerived1 *) &b,(CDerived1 *)&d1,(CDerived1 *)&d2 };
CDerived2 *pd2[3] = { (CDerived2 *)&b,(CDerived2 *)&d1,(CDerived2 *)&d2 };

6) pro ukazatele z minulého bodu zavolejte metodu Print. Co očekáváte a co se stane.

7) Změňte (přidejte vlastnost) pro metodu Print vlastnost tak, aby byla realizována pozdní vazbou (polymorfizmus).
Porovnejte tisk průběhu s minulým tiskem před přidáním pozdní vazby.
Na jakých proměnných se tato změna může projevit - objekt nebo přístup přes ukazatel?
Opět pro ukazatele z minulého bodu zavolejte metodu Print. Co očekáváte a co se stane.

8) Vysvětlete, která/které kombinace ukazatelů pb,pd1,pd2 a jejich inicializací dávají smysl, a které jsou špatně.

9) Je možné zjistit typ proměnné "programově" (všimněte si, že plně "funguje" až po zavedení vlastnosti virtual, kdy použije pozdní vazbu. Jinak je tato funkce "vyřešena" při překladu).
Pomocí příkazu typeid je možné získat strukturu type_info.
Pomocí metody name() můžeme například zjistit jméno typu objektu. typeid( XXX ).name();

10) vytvořte dynamickou proměnnou typu CDerived2 a ihned ji zrušte pomocí delete.
Porovnejte počet vzniklých a zaniklých objektů.
Přidejte k destruktoru virtualitu a srovnejte s předchozím.