Maison > développement back-end > C++ > Comment les constructeurs et les destructeurs sont-ils appelés dans l'héritage C ?

Comment les constructeurs et les destructeurs sont-ils appelés dans l'héritage C ?

Patricia Arquette
Libérer: 2024-11-29 04:10:09
original
296 Les gens l'ont consulté

How are Constructors and Destructors Called in C   Inheritance?

Ordre des appels de constructeur et de destructeur dans l'héritage

Dans la programmation orientée objet avec héritage, comprendre l'ordre des appels de constructeur et de destructeur est crucial . Cela devient particulièrement important lorsqu'il s'agit de plusieurs classes de base et compositions d'objets.

Considérez la hiérarchie de classes suivante :

struct A {
    A() { cout << "A() C-tor" << endl; }
    ~A() { cout << "~A() D-tor" << endl; }
};

struct B : public A {
    B() { cout << "B() C-tor" << endl; }
    ~B() { cout << "~B() D-tor" << endl; }

    A a;
};
Copier après la connexion

Dans la fonction principale :

int main() {
    B b;
}
Copier après la connexion

Ici sont les règles régissant l'ordre des appels de constructeur et de destructeur dans cette hiérarchie d'héritage :

Constructeur Appels :

  1. Construction de la classe de base : Les appels du constructeur commencent par la classe de base. Dans ce cas, le constructeur de A est appelé en premier.
  2. Construction du champ membre : Ensuite, les champs membres sont construits dans l'ordre dans lequel ils sont déclarés dans la classe dérivée. Dans ce cas, le champ a de B de type A est construit.
  3. Construction de classe dérivée : Enfin, le constructeur de la classe dérivée, B, est appelé.

Appels du destructeur :

L'ordre des appels du destructeur est l'inverse de l'appel du constructeur order :

  1. Destructeur de classe dérivée : Le destructeur de la classe dérivée, B, est appelé en premier.
  2. Destructeur de champ membre : Ensuite, le destructeur du champ membre a est appelé, détruisant son instance de A.
  3. Destructeur de classe de base : Enfin, le destructeur de la classe de base, A, est appelé.

Liste d'initialisation par défaut :

Même sans liste d'initialisation explicitement définie, le champ membre sera initialisé avant l'appel du constructeur de classe dérivée. Dans ce cas, a serait initialisé avec le constructeur par défaut de A.

Par conséquent, la sortie attendue pour le code dans la fonction principale serait :

A() C-tor
A() C-tor
B() C-tor
~B() D-tor
~A() D-tor
~A() D-tor
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal