Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Constructeur et Destructeur en Héritage | Aperçu de l'Héritage
Programmation Orientée Objet en C++

book
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

main.cpp

copy
#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;
}
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; }
Note
Remarque

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

main.cpp

copy
class Base {
public:
Base(int value)
: data(value) {}
private:
int data;
};

class Derived : public Base {
public:
Derived(int value)
: Base(value) {}
};

int main()
{

}
123456789101112131415161718
class 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

main.cpp

copy
#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;
}
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; }
Note
Remarque

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é.

question mark

Quel est l'ordre correct d'appel des constructeurs et des destructeurs lors de la création et de la destruction d'un objet d'une classe dérivée ?

Select the correct answer

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 4

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

We use cookies to make your experience better!
some-alt