Lorsque je remplace une classe en C ++ (avec un destructeur virtuel), j'implémente à nouveau le destructeur en tant que virtuel sur la classe héritée, mais dois-je appeler le destructeur de base?
Si c'est le cas, 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?
c++
destructor
Nick Bolton
la source
la source
delete
à un pointeur vers la classe de base deux fois provoque une erreur de segmentation?Non, vous n'avez pas besoin d'appeler le destructeur de base, un destructeur de base est toujours appelé pour vous par le destructeur dérivé. Veuillez voir ma réponse connexe ici pour l'ordre de destruction .
Pour comprendre pourquoi vous voulez un destructeur virtuel dans la classe de base, veuillez consulter le code ci-dessous:
Quand vous faites:
Ensuite, si vous n'aviez pas de destructeur virtuel dans B, seul ~ B () serait appelé. Mais puisque vous avez un destructeur virtuel, d'abord ~ D () sera appelé, puis ~ B ().
la source
Ce que les autres ont dit, mais notez également que vous n'avez pas à déclarer le destructeur virtuel dans la classe dérivée. Une fois que vous déclarez un destructeur virtuel, comme vous le faites dans la classe de base, tous les destructeurs dérivés seront virtuels, que vous le déclariez ou non. En d'autres termes:
la source
Non. Contrairement à d'autres méthodes virtuelles, où vous appelez explicitement la méthode Base à partir de Derived 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.
la source
Non, vous n'appelez jamais le destructeur de classe de base, il est toujours appelé automatiquement comme d'autres l'ont souligné, mais voici une preuve de concept avec des résultats:
La sortie est:
Si vous définissez le destructeur de classe de base comme virtuel, ce qui devrait être le cas, les résultats du cas 3 seraient les mêmes que les cas 1 et 2.
la source
Non, il est automatiquement appelé.
la source
Les destructeurs en C ++ sont automatiquement appelés dans l'ordre de leurs constructions (dérivé puis base) uniquement lorsque le destructeur de classe Base est déclaré
virtual
.Sinon, seul le destructeur de classe de base est invoqué au moment de la suppression de l'objet.
Exemple: sans destructeur virtuel
Production
Exemple: avec le destructeur virtuel de base
Production
Il est recommandé de déclarer le destructeur de classe de base car
virtual
sinon, cela provoque un comportement indéfini.Référence: Virtual Destructor
la source