Constructeur et Destructeur en Héritage
Constructeur de la classe de base en premier
Dans le contexte de l'héritage, les constructeurs jouent un rôle essentiel dans l'initialisation correcte des classes dérivées. Comprendre l'ordre dans lequel les constructeurs sont appelés est fondamental pour saisir la dynamique de l'héritage. Observez la sortie de l'extrait de code ci-dessous pour voir l'ordre des appels des constructeurs.
main.cpp
12345678910111213141516#include <iostream> class Base { public: Base() { std::cout << "Base constructor called" << std::endl; } }; class Derived : public Base { public: Derived() { std::cout << "Derived constructor called" << std::endl; } }; int main() { Derived derivedObj; }
Une fois que le constructeur de la classe de base a terminé son initialisation, le constructeur de la classe dérivée est exécuté.
La superclasse est appelée en premier car elle doit initialiser les membres hérités de la sous-classe. Cela garantit que la sous-classe commence avec un état valide et peut s'appuyer sur l'état initialisé de sa classe de base.
main.cpp
123456789101112131415161718class Base { public: Base(int value) : data(value) {} private: int data; }; class Derived : public Base { public: Derived(int value) : Base(value) {} }; int main() { }
Dans l'exemple, le constructeur est appelé avec des paramètres dans la liste d'initialisation. Il est nécessaire d'appeler explicitement le constructeur de la superclasse dans la liste d'initialisation du constructeur de la sous-classe. Si aucun constructeur de la classe de base n'est spécifié dans la liste d'initialisation, le constructeur par défaut de la superclasse est appelé automatiquement.
Destructeur de la classe dérivée en premier
Lorsqu’un objet est détruit, les destructeurs sont appelés dans l’ordre inverse de leurs constructeurs. Cela signifie que les destructeurs sont invoqués d’abord pour la classe la plus dérivée, puis pour chaque classe de base dans l’ordre inverse de leur déclaration.
main.cpp
12345678910111213141516#include <iostream> class Base { public: ~Base() { std::cout << "Base destructor called" << std::endl; } }; class Derived : public Base { public: ~Derived() { std::cout << "Derived destructor called" << std::endl; } }; int main() { Derived derivedObj; }
Ce n’est qu’après que le destructeur de la classe dérivée a terminé son nettoyage que le destructeur de la classe de base est invoqué.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion