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.