Quel est l'ordre dans lequel les destructeurs et les constructeurs sont appelés en C++? En utilisant les exemples de certaines classes de base et les classes dérivéesQuel est l'ordre dans lequel les destructeurs et les constructeurs sont appelés en C++?
Répondre
L'ordre est:
- constructeur de base
- constructeur dérivé
- destructor dérivé
- base destructor
Exemple:
class B
{
public:
B()
{
cout<<"Construct B"<<endl;
}
virtual ~B()
{
cout<<"Destruct B"<<endl;
}
};
class D : public B
{
public:
D()
{
cout<<"Construct D"<<endl;
}
virtual ~D()
{
cout<<"Destruct D"<<endl;
}
};
int main(int argc, char **argv)
{
D d;
return 0;
}
Sortie d'exemple:
Construct B
Construct D
Destruct D
Destruct B
Plusieurs niveaux d'héritage fonctionne comme une pile:
Si vous envisagez de pousser un élément sur la pile que la construction et l'enlever comme la destruction, alors vous pouvez regarder à plusieurs niveaux d'héritage comme une pile.
Cela fonctionne pour n'importe quel nombre de niveaux.
Exemple D2 dérive D dérive de B.
poussoir B sur la pile, pousser D sur la pile, pousser D2 sur la pile. Donc, l'ordre de construction est B, D, D2. Ensuite, pour connaître l'ordre de destruction, commencez à sauter. D2, D, B
Des exemples plus complexes:
Pour des exemples plus compliqués, s'il vous plaît voir le lien fourni par @JaredPar
Une description détaillée de ces événements, y compris l'héritage virtuel et multiple est disponible à la FAQ C++ Lite. Section 25,14 et 25,15
https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order
Le lien fourni est mort . – jbx
Maintenant, le lien fonctionne bien. –
De plus, gardez à l'esprit que si les éléments du tableau sont construits d'abord -> dernier, ils sont détruits dans l'ordre inverse: dernière -> première.
+1 C'est vrai pour presque tout. L'ordre de destruction est toujours le contraire de la construction. Les variables statiques n'ont pas d'ordre de construction garanti, mais la destruction se fera dans l'ordre inverse. –
Est-ce que le comportement du conteneur est un modèle (attendu) et/ou un comportement intégré 'new []'/'delete []'? – franji1
Je dois ajouter aux réponses précédentes parce que tout le monde semble ignorer
Lorsque vous avez un dérivé instance de classe étant créé, il est vrai que le code intérieur le constructeur de la base sera appelé avant le code intérieur le constructeur de la dérivé, mais gardez à l'esprit que le dérivé est toujours techniquement « créé »avant la base .
Et quand vous avez la destructor classe dérivé appelé, il est vrai que le code intérieur le destructor dérivé est appelé avant le code intérieur la destructor de base, mais aussi garder dans l'esprit que le base est détruitavant le dérivé.
Quand je dis créé/détruit Je me réfère en fait à alloué/deallocated.
Si vous regardez la disposition de la mémoire de ces instances, vous verrez que l'instance dérivée compose l'instance de base. Par exemple:
Mémoire dérivée: 0x00001110 0x00001120 à
Mémoire de base: 0x00001114 0x00001118 à
Par conséquent, la classe dérivée doit être allouée AVANT la base dans la construction. Et la classe dérivée doit être désaffectée APRÈS la base dans la destruction.
Si vous avez le code suivant:
class Base
{
public:
Base()
{
std::cout << "\n Base created";
}
virtual ~Base()
{
std::cout << "\n Base destroyed";
}
}
class Derived : public Base
{
public:
Derived()
// Derived is allocated here
// then Base constructor is called to allocate base and prepare it
{
std::cout << "\n Derived created";
}
~Derived()
{
std::cout << "\n Derived destroyed";
}
// Base destructor is called here
// then Derived is deallocated
}
Donc, si vous avez créé Derived d;
et l'avait hors de portée, alors vous obtiendrez la sortie dans @ la réponse de Brian.Mais le comportement de l'objet en mémoire est pas vraiment en ordre, il est plus comme ceci:
Construction:
Dérivée alloués
base AFFECTÉ
constructeur de base appelé Constructeur dérivé appelé
Destruction:
destructor dérivé appelé
destructor de base appelée
base désallouée
Dérivé désattribuées
- 1. Quel est le mécanisme par lequel les destructeurs sont appelés pour les objets affectés par la pile?
- 2. A propos des constructeurs/destructeurs et des opérateurs nouveaux/supprimés en C++ pour les objets personnalisés
- 3. Les goto et les destructeurs sont-ils compatibles?
- 4. Question sur les destructeurs C++
- 5. Ordre d'initialisation avec les constructeurs en C++
- 6. En C#, quelle est la meilleure façon d'enchaîner les constructeurs?
- 7. jQuery Sortable - les événements sont appelés trop de fois
- 8. viewDidAppear et viewWillDisappear ne sont pas appelés dans UIViewController
- 9. Modèles C# et constructeurs spéciaux
- 10. Quand les blocs init de l'instance sont-ils appelés?
- 11. C#: Comment se référer à default (T) et les constructeurs dans les commentaires xml
- 12. Quelles sont les conventions pour les en-têtes et les fichiers cpp en C++?
- 13. Combien et quelles sont les utilisations de "const" en C++?
- 14. méthodes Overridable dans les constructeurs avec InitMembers()
- 15. Hibernate et les transactions de printemps - en utilisant les constructeurs privés/méthodes d'usine statiques
- 16. Quels sont les spécificateurs d'accès disponibles dans C#? Quel est le défaut?
- 17. Comment utiliser les constructeurs de classe de base et l'opérateur d'affectation en C++?
- 18. Constructeurs génériques et réflexion
- 19. Quels sont les types de chaînes les plus utilisés en C++ et comment les convertir?
- 20. Dans quel assemblage les UserControls ASP.NET sont-ils placés?
- 21. Dans LabVIEW, obtenir sans charger les appelés VI
- 22. Les variables d'objet dans javascript sont-elles énumérées dans l'ordre dans lequel elles ont été ajoutées?
- 23. Quel est le meilleur code pour convertir les paramètres BSTR en ANSI en C/C++?
- 24. Est-ce que les constructeurs d'imbrication (ou les méthodes d'usine) sont bons ou doivent-ils tous fonctionner?
- 25. NHibernate 2.1 Proxy Usine options - quelles sont les différences et lequel choisir?
- 26. Méthodes Overridable dans les constructeurs - Aide pour corriger
- 27. Pourquoi est-il permis de pointer vers les paramètres constructeurs?
- 28. Les constructeurs se moquent de Grails
- 29. Les destructeurs doivent-ils être exportés dans les bibliothèques DLL Windows?
- 30. Http Les modules sont appelés à chaque requête lors de l'utilisation du module mvc/routing
Peut-être que l'OP veut connaître la classe D: public A, B, C ... –
L'héritage multiple ajoute de la complexité: http://www.gotw.ca/gotw/080.htm –