Les destructeurs virtuels sont utiles lorsque vous pouvez potentiellement supprimer une instance d'une classe dérivée par le biais d'un pointeur vers la classe de base :
class Base
{
// some virtual methods
};
class Derived : public Base
{
~Derived()
{
// Do some important cleanup
}
};
Ici, vous remarquerez que je n'ai pas déclaré le destructeur de Base comme étant virtual
. Maintenant, regardons l'extrait suivant :
Base *b = new Derived();
// use b
delete b; // Here's the problem!
Puisque le destructeur de Base n'est pas virtual
y b
est un Base*
pointant vers un Derived
objet, delete b
tiene comportement indéfini :
[En delete b
], si le type statique de la de l'objet à supprimer est différent de son type dynamique, le type statique statique est une classe de base du type dynamique de l'objet à supprimer supprimé et le type statique doit avoir un destructeur virtuel ou le type comportement est indéfini .
Dans la plupart des implémentations, l'appel au destructeur sera résolu comme tout code non virtuel, ce qui signifie que le destructeur de la classe de base sera appelé mais pas celui de la classe dérivée, ce qui entraîne une fuite de ressources.
En résumé, il faut toujours faire en sorte que les destructeurs des classes de base virtual
alors qu'ils sont destinés à être manipulés de manière polymorphe.
Si vous voulez empêcher la suppression d'une instance par le biais d'un pointeur de classe de base, vous pouvez faire en sorte que le destructeur de la classe de base soit protégé et non virtuel ; ce faisant, le compilateur ne vous laissera pas appeler delete
sur un pointeur de classe de base.
Vous pouvez en savoir plus sur la virtualité et le destructeur virtuel de la classe de base dans cet article de Herb Sutter .
7 votes
Voir ça : Destructeur virtuel
177 votes
Chaque destructeur en bas est appelé quoi qu'il arrive.
virtual
s'assure qu'il commence en haut plutôt qu'au milieu.18 votes
Question connexe : Quand ne faut-il pas utiliser les destructeurs virtuels ?
0 votes
@MooingDuck c'est un commentaire quelque peu trompeur.
0 votes
@EuriPinhollow Pouvez-vous préciser ?
1 votes
@FranklinYu c'est bien que vous demandiez parce que maintenant je ne vois pas de problème avec ce commentaire (sauf essayer de donner une réponse dans les commentaires).
0 votes
@FranklinYu J'ai probablement pensé qu'il devrait y avoir une demande plus spécifique (c'est-à-dire quand la destruction peut commencer au milieu de l'arbre d'héritage au lieu du sommet) mais c'est ce que les réponses élaborent déjà.
2 votes
Je suis également confus par la réponse de @MooingDuck. Cela ne devrait-il pas être en haut au lieu de en bas si vous utilisez la notion de sous-classe (sous) et de super-classe (au-dessus) ?
2 votes
@Nibor : Oui, si vous utilisez cette notion . Environ la moitié des gens à qui je parle considèrent les superclasses comme "au-dessus", et l'autre moitié les considère comme "en dessous", donc les deux sont des normes contradictoires, ce qui rend tout confus. Je pense que la superclasse comme "au-dessus" est légèrement plus commune, mais ce n'est pas la façon dont on m'a enseigné :(
0 votes
Cet article pourrait vous aider. medium.com/@tunvirrahmantusher/