C++ automatické vygenerování destruktoru

sobol8

C++ automatické vygenerování destruktoru
« kdy: 22. 05. 2014, 11:14:39 »
Dobrý den,

pomozte mi, prosím, objasnit jednu moji nejasnost. Mám kód:

Kód: [Vybrat]
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ěď


JSH

Re:C++ automatické vygenerování destruktoru
« Odpověď #1 kdy: 22. 05. 2014, 12:13:43 »
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.

Sten

Re:C++ automatické vygenerování destruktoru
« Odpověď #2 kdy: 22. 05. 2014, 15:47:16 »
  • Ano, kontakt třídy A říká, že destruktory jsou virtuální.
  • Ne, to by rozbilo kontrakt třídy A a proto to C++ nedovoluje.