Maison >développement back-end >C++ >Quel est l'ordre de construction et de destruction dans l'héritage C ?

Quel est l'ordre de construction et de destruction dans l'héritage C ?

DDD
DDDoriginal
2024-11-29 12:04:11684parcourir

What's the Order of Construction and Destruction in C   Inheritance?

Ordre de construction et de destruction dans l'héritage

Considérez la hiérarchie de classes suivante :

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

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

    A a;
};

Lorsqu'une instance de B est créé (comme dans int main() { B b; }), l'ordre de construction et de destruction suit des règles :

Ordre de construction :

  1. Constructeur de classe de base : Le constructeur de la classe de base (A) est appelé en premier.
  2. Construction des champs membres : Les champs membres de la classe dérivée (B) sont construits dans l'ordre dans lequel ils sont déclarés. Dans ce cas, l'instance a de la classe A est construite.
  3. Constructeur de classe dérivée : Enfin, le constructeur de la classe dérivée (B) est appelé.

Cela se traduit par l'appel suivant ordre :

  • A()
  • A(a)
  • B()

Ordre de destruction :

  1. Destructeur de classe dérivé : Le destructeur de la classe dérivée (B) est appelée en premier.
  2. Destruction des champs membres : Les champs membres de la classe dérivée sont détruits dans l'ordre inverse de leur construction. Dans ce cas, l'instance a de la classe A est détruite.
  3. Destructeur de classe de base : Enfin, le destructeur de la classe de base (A) est appelé.

Cela entraîne la destruction suivante ordre :

  • ~B()
  • ~A(a)
  • ~A()

Par conséquent, l'ordre de construction commence par la classe de base, passe aux champs membres et se termine par la classe dérivée. L'ordre de destruction est l'inverse de l'ordre de construction.

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:
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