Pourquoi destructeur de la classe de base virtuelle () est appelée quand un objet de classe dérivée est supprimé?
Une différence entre un destructeur (aussi bien sûr le constructeur) et d'autres fonctions de membre est que, si un membre régulier de la fonction de corps à la classe dérivée, seule la version à la classe Dérivée est exécuté. Alors que dans le cas de destructeurs, tous deux dérivés ainsi que de la classe de base des versions exécuté?
Il sera bon de savoir exactement ce qui se passe en cas de destructeur (peut-être virtuel) & constructeur, qu'ils sont appelés pour l'ensemble de ses classes de base, même si la plupart des dérivés de la classe de l'objet est supprimé.
Merci d'avance!
- Pas exactement ce que vous voulez, mais il montre ce que le compilateur a généré destructeur va faire. stackoverflow.com/questions/1810163/...
Vous devez vous connecter pour publier un commentaire.
Que dit la Norme
Aussi par RAII ressources doivent être liées à la durée de vie des objets appropriés et les destructeurs des classes respectives doivent être appelés à libérer les ressources.
Par exemple le code suivant des fuites de mémoire.
Constructeur et le destructeur sont différents du reste de méthodes ordinaires.
Constructeur
Destructeur:
de sortie:
Si la méthode dans la classe de base est marqué comme
virtual
tous les hérité méthodes sont virtuelles ainsi donc, même si vous ne marquez pas les destructeurs dansD
etE
commevirtual
ils seront encorevirtual
et qu'ils sont toujours appelés dans le même ordre.C'est par la conception. Le destructeur de la classe de base doit être appelé pour la libération de ses ressources. La règle de base est qu'une classe dérivée ne doit nettoyer ses propres ressources et de laisser la classe de base pour nettoyer lui-même.
De C++ spec:
Aussi, car il n'y a qu'un seul destructeur, il n'y a aucune ambiguïté quant à la destructeur d'une classe doit appeler. Ce n'est pas le cas pour les constructeurs, où un programmeur doit choisir le constructeur de classe de base doit être appelée si il n'y a pas un accessibles de constructeur par défaut.
Parce que c'est comment dtor du travail. Lorsque vous créez un objet, ctors sont appelées à partir de la base, et aller tout le chemin à la plupart des dérivés. Quand vous détruisez les objets (correctement) l'inverse qui se passe. Le temps que de faire un dtor virtuel qui fait la différence est si/lorsque vous détruisez un objet par l'intermédiaire d'un pointeur (ou une référence, même si c'est assez rare) pour le type de base. Dans ce cas, l'alternative n'est pas vraiment que seul le dérivé dtor est appelé -- ou plutôt, l'alternative est simplement un comportement indéfini. Que faire arriver à prendre la forme d'invoquer uniquement la dérivée dtor, mais il pourrait prendre une tout autre forme.
Comme Igor dit constructeurs doivent être appelés pour les classes de base. Demander ce qui se passerait s'il ne serait pas appelé:
Si destructeur pour
A
ne serait pas appelée lors de la suppression d'unB
exemple,A
ne serait jamais nettoyé.Un destructeur de la classe de base peut être responsable du nettoyage de ressources qui ont été allouées par le constructeur de classe de base.
Si votre base de classe a un constructeur par défaut (celui qui ne prend pas de paramètres ou contient des valeurs par défaut pour tous les paramètres) que le constructeur est automatiquement appelée lors de la construction d'un dérivé de l'instance.
Si votre base de classe a un constructeur qui nécessite des paramètres, vous devez l'appeler manuellement dans la liste d'initialiseur de la classe dérivée constructeur.
Votre base destructeur de classe sera toujours automatiquement appelée lors de la suppression de la dérivée de l'instance depuis les destructeurs ne prennent pas de paramètres.
Si vous êtes en utilisant le polymorphisme et votre dérivé de l'instance est indiqué par une classe de base pointeur, puis le dérivés destructeur de classe n'est appelée que si la base destructeur est virtuel.
Lorsqu'un objet est détruit, les destructeurs exécuter pour tous les sous-objets. Cela comprend à la fois la réutilisation par le confinement et la réutilisation par l'héritage.