Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: sobol8 22. 05. 2014, 11:14:39

Název: C++ automatické vygenerování destruktoru
Přispěvatel: sobol8 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ěď
Název: Re:C++ automatické vygenerování destruktoru
Přispěvatel: JSH 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.
Název: Re:C++ automatické vygenerování destruktoru
Přispěvatel: Sten 22. 05. 2014, 15:47:16