Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: sobol8 22. 05. 2014, 11:14:39
-
Dobrý den,
pomozte mi, prosím, objasnit jednu moji nejasnost. Mám kód:
class A
{
public:
A();
virtual void x();
virtual ~A();
};
class B : public A
{
public:
B();
virtual void x() {}
};
Třída A je abstraktní, třída B je polymorfní, ale nenapsal jsem do ní záměrně destruktor (přestože díky virtuální metodě by tam měl virtuální destruktor být).
Co nevím:
1. jaký destruktor se vygeneruje, když ho explicitně nenapíšu - bude už ve všech potomcích virtuální - je to pravidlo?
2. když budu mít ve třídě A virtuální destruktor, můžu ve třídě B explicitně vytvořit standartní destruktor?
Děkuji za odpověď
-
1) Vygeneruje se virtuální destruktor, který jako každý vygenerovaný destruktor zruší členské proměnné a bázové třídy jejich destruktory.
2) Nejde to. Překladač tam to virtual dokáže dodat automaticky. I u B::x by to virtual být nemuselo. Stačí, když je v základní třídě. Ale dával bych ho tam kvůli přehlednosti.
Pro jistu bych využil i věci z C++11 a napsal do B :
virtual ~B() = default; // chceme vygenerovaný destruktor
virtual void x() override; // x() je i v A, jinak chyba
To override mi už pár chyb chytlo.
-
- Ano, kontakt třídy A říká, že destruktory jsou virtuální.
- Ne, to by rozbilo kontrakt třídy A a proto to C++ nedovoluje.