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
402 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!

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