Aucun des constructeurs Virtuels mais destructeur virtuel
Si nous n'avons pas des constructeurs virtuels alors pourquoi nous avons virtuel destructeurs? Peut constructeurs aussi être virtuel?
double possible de Pourquoi n'avons-nous pas un constructeur virtuel en C++?
Je pense que la question est plutôt, pourquoi nous avons virtuel destructeurs en C++?
Je pense que la question est plutôt, pourquoi nous avons virtuel destructeurs en C++?
OriginalL'auteur Parag | 2012-03-29
Vous devez vous connecter pour publier un commentaire.
le type est créé, et il est bien connu au moment de la compilation. Le compilateur
n'avez pas besoin [et en fait impossible, puisque la dynamique de l'expédition est basé
sur l'information qui est créé seulement après la création de l'objet].
Donc il n'y a pas des constructeurs virtuels.
surveiller le système. Supposons que vous disposez d'
A* a = new B;
[B
héritede
A
], et, plus tard, vousdelete a;
- le compilateur n'a aucun moyen desachant
a
est unB
[dans le cas général], et invoqueraA
'sdestructeur - si ce n'était pas virtuel, et vous pouvez avoir une fuite de mémoire,
ou d'autres défauts.
B
s'est destructeurappelé, depuis un
B
objet est détruit.Lorsque vous faites appel à un constructeur - c'est quelque chose comme
new MyClass;
. Le type dynamique et type statique de l'objet créé - sont exactement les mêmes, le véritable objet concret.OriginalL'auteur amit
Virtuel destructeurs sont nécessaires parce qu'à la destruction du temps, on ne sait pas toujours quel type vous êtes en relation avec:
La
delete
dans le programme ci-dessus estmain
ne sais pas si sap
points pour unBase
ou unDerived
objet, mais si leBase
destructeur estvirtual
(comme il devrait l'être), puisdelete
pouvez utiliser*p
's vtable de trouver le bon destructeur.En revanche, au moment de la construction, vous pouvez toujours savoir de quel type d'objet que vous créez. (Et au cas où vous ne le faites pas, alors vous pouvez créer une usine ou "virtuel constructeur" qui sait.)
OriginalL'auteur Fred Foo
Les constructeurs sont appelés à un moment où nous créons un objet de la classe afin que lorsque nous héritons de la classe de base des constructeurs appelle qu'une seule fois donc pas besoin d'être virtuel.
Mais lorsque nous avons accès à la classe dérivée à partir du pointeur de la classe de base, si nous voulons supprimer l'objet de la classe dérivée de nous le supprimer par le pointeur de la classe de base, mais en supprimer(pointer_of_base) va appeler le destructeur de la classe de base mais la devise est de supprimer la classe dérivée . ainsi nous avons besoin de le destructeur virtuel dans la nature.
OriginalL'auteur Narendra kumawat