388 votes

Ai-je besoin d'appeler explicitement le destructeur virtuel de base?

En redéfinissant une classe en C ++ (avec un destructeur virtuel), j'implémente à nouveau le destructeur comme virtuel sur la classe héritière, mais dois-je appeler le destructeur de base?

Si oui, j'imagine que c'est quelque chose comme ça ...

 MyChildClass::~MyChildClass() // virtual in header
{
    // Call to base destructor...
    this->MyBaseClass::~MyBaseClass();

    // Some destructing specific to MyChildClass
}
 

Ai-je raison?

522voto

Lou Franco Points 48823

Non, les destructeurs sont appelés automatiquement dans l'ordre inverse de la construction. (Les classes de base durent). N'appelez pas les destructeurs de classe de base.

97voto

Brian R. Bondy Points 141769

Non, vous n'avez pas besoin d'appeler la base destructeur, une base destructeur est toujours appelé pour vous par le dérivé destructeur. Veuillez voir mes réponse ici pour l'ordre de destruction.

Pour comprendre pourquoi vous voulez un destructeur virtuel de la classe de base, veuillez consulter le code ci-dessous:

class B
{
public:
    virtual ~B()
    {
        cout<<"B destructor"<<endl;
    }
};


class D : public B
{
public:
    virtual ~D()
    {
        cout<<"D destructor"<<endl;
    }
};

Lorsque vous faites:

B *pD = new D();
delete pD;

Alors si vous n'avez pas un destructeur virtuel dans B, seulement ~B() sera appelée. Mais puisque vous avez un destructeur virtuel, d'abord ~D() sera appelée, ~B().

10voto

itsmatt Points 18905

Contrairement à d'autres méthodes virtuelles, où vous appelez explicitement la méthode Base de la chaîne dérivée pour «chaîner» l'appel, le compilateur génère du code pour appeler les destructeurs dans l'ordre inverse dans lequel leurs constructeurs ont été appelés.

6voto

Benoît Points 10901

Non, il est automatiquement appelé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X