Remplacer Destructeur C++
Du C++ FAQ:
[11.4] puis-je surcharge le destructeur de ma classe?
No.
Je me rends compte cela signifie que vous ne pouvez pas changer le type de retour, les arguments de type ni sur le nombre d'arguments. Je suis peut-être le fractionnement des poils sur la syntaxe des mots, mais est-il possible de remplacer du Parent destructeur?
class Child : public Parent {
public:
virtual Parent::~Parent() {
//New definition
}
};
Et le faire de manière récursive?
class Grandchild : public Child {
public:
Child::Parent::~Parent() {
//An even newer definition
}
};
J'ai lu cette et un related post et ça me fait penser, parce que les destructeurs ne sont pas héritées, ils ne peuvent pas être remplacés, mais je n'ai jamais vu, il est explicitement indiqué.
EDIT: j'ai changé ce afin de refléter le fait que je veux remplacer le Parent destructeur, une note de l'enfant et petit-Enfant primordial ~Parent().
La principale raison pour laquelle je fais cela est de maintenir Parent de l'interface tout en changeant la façon dont il est détruit (la raison de toute la classe enfant). Je vais avoir quelque chose d'autre la gestion de tous les Parents est créé et va appeler explicitement leurs destructeurs à un moment plus tard de mon choix.
bien sûr, les destructeurs sont héritées. Si vous ne fournissez pas un destructeur de la classe fille substitution de la mère, vous êtes en effet hériter de la classe de base destructeur. Overiding destructeurs de la société mère dans les classes dérivées fait beaucoup de sens, comme vous pouvez le voir dans certains des exemples donnés ci-dessous.
Les destructeurs sont pas hérité. Si vous ne déclarez pas un destructeur, le compilateur génère un pour vous. Classe de Base des destructeurs sont appelés automatiquement après de l'implicite destructeur s'exécute. Voir la Norme de devis dans ma réponse.
Envisager, si le destructeur d'une classe de base a été hérité par une classe dérivée, comment la dérivée de la classe de membres de la détruire?
ils sont hérités." Non, les destructeurs ne sont pas héréditaires. 12.4/3: "Si une classe n'a pas l'utilisateur déclaré destructeur, un destructeur est déclarée implicitement."
OriginalL'auteur Danny A | 2013-06-13
Vous devez vous connecter pour publier un commentaire.
Non, vous sont certainement pas – ce sont deux choses très différentes.
Oui, et en fait, vous doit ce faire, dans de nombreux cas. Dans l'ordre pour que cela fonctionne pour un objet polymorphe, vous devez déclarer le destructeur de la classe de base comme
virtual
:Va l'appeler correctement
p.~Child()
à la fin de la portée, carParent::~Parent
est virtuel.Ah. “destructeur”, évidemment.
constructeurs virtuels n'existent pas. Et vous ne pouvez même appeler des méthodes virtuelles dans un constructeur.
Mais est-ce répondre à la question? Je veux de l'Enfant à redéfinir cet appel à ~Parent().
malheureusement, vous ne pouvez pas, il peut seulement être un destructeur de définition de chaque classe.
OriginalL'auteur Konrad Rudolph
Oui, il est possible de remplacer le destructeur d'une classe. En fait, lorsque vous définissez une hiérarchie de classes dans laquelle le polymorphisme est utilisé, vous doit déclarer un destructeur virtuel de la classe de base.
Remplacements de destructeurs de travail exactement de la même manière substitue à la normale des fonctions de membre du travail que lorsque vous détruisez un objet par
delete
ing de l'objet par l'intermédiaire d'un pointeur vers la classe de base, le destructeur de la classe dérivée est bien appelé. C'est pourquoi vous devez avoir un destructeur virtuel de la classe de base pour polymorphes hiérarchies.Cependant, il y a une différence entre le virtuel destructeurs virtuels et membre des méthodes qui n'a rien à voir avec la
virtual
nature du destructeur. C'est lors de l'exécution d'un code comme ceci:...lorsque vous appelez
a->Foo()
, la méthodeFoo()
dansB
est appelé. DepuisB::Foo()
n'est pas explicitement appelA::Foo()
,A::Foo()
n'est pas appelé.Toutefois, lorsque l'objet est détruit par
delete a;
, d'abord le destructeurB::~B()
est appelé, et puis après ça se termine, mais avant le contrôle retourne au programme de la classe de base, destructeurA::~A()
est aussi appelé.Bien sûr, cela est évident quand on y pense, et encore, cela n'a rien à voir avec la
virtual
la nature de l'destructeur, mais elle ne se comportent différemment normal qu'unvirtual
appel de méthode, donc je pensais le point.Obligitory Standard Citation:
[C++03] 12.4/6 : Les Destructeurs
OriginalL'auteur John Dibling
Oui: vous pouvez avoir
virtual
destructeurs, et la seule raison est de les remplacer dans les classes dérivées.Il ressemble à ceci:
Noter que le destructeur n'est pas remplacée par nom comme de simples fonctions, parce que le nom est toujours celle de la classe dont l'exemple vous êtes à la détruire.
Note également que le parent de la classe de destructeurs sont toujours trop, de sorte que vous n'avez pas besoin de dupliquer leur code de nettoyage: lire sur l'objet de membre et de la classe de base de la sous-construction de l'objet et de la destruction de l'ordre pour plus de détails.
Terminologie
virtual
fonction dans une classe dérivée. Vous ne pouvez pas modifier la signature (à l'exception de l'aide covariante des types de retour). Donc, un remplacer toujours a la même signature que hérité d'une fonction virtuelle.OriginalL'auteur Useless
Oui, vous pouvez et devez faire un destructeur virtuel, chaque fois que vous avez un enfant de la classe qui peut être détruit à l'aide d'une référence à la classe de base. L'analyse statique de code outils peuvent même se plaindre si vous ne pas offre un destructeur virtuel.
Considérons l'exemple suivant:
Si le destructeur a été pas virtuel, puis
delete a
serait seulement Un appel du destructeur, et vous vous retrouvez avec une fuite de mémoire. Mais parce que c'est virtuel, à la fois destructeurs seront appelés, dans l'ordre~B()
->~A()
.OriginalL'auteur Taylor Brandstetter