Heim >Backend-Entwicklung >C++ >Wie werden Konstruktoren und Destruktoren bei der C-Vererbung aufgerufen?

Wie werden Konstruktoren und Destruktoren bei der C-Vererbung aufgerufen?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-29 04:10:09385Durchsuche

How are Constructors and Destructors Called in C   Inheritance?

Reihenfolge von Konstruktor- und Destruktoraufrufen bei der Vererbung

Bei der objektorientierten Programmierung mit Vererbung ist das Verständnis der Reihenfolge von Konstruktor- und Destruktoraufrufen von entscheidender Bedeutung . Dies wird besonders wichtig, wenn es um mehrere Basisklassen und Objektzusammensetzungen geht.

Beachten Sie die folgende Klassenhierarchie:

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;
};

In der Hauptfunktion:

int main() {
    B b;
}

Hier sind die Regeln, die die Reihenfolge der Konstruktor- und Destruktoraufrufe in dieser Vererbung regeln Hierarchie:

Konstruktoraufrufe:

  1. Basisklassenkonstruktion: Konstruktoraufrufe beginnen mit der Basisklasse. In diesem Fall wird zuerst der Konstruktor von A aufgerufen.
  2. Memberfeldkonstruktion: Als Nächstes werden Memberfelder in der Reihenfolge erstellt, in der sie in der abgeleiteten Klasse deklariert werden. In diesem Fall wird das Feld a von B vom Typ A konstruiert.
  3. Konstruktion abgeleiteter Klassen: Schließlich wird der Konstruktor der abgeleiteten Klasse B aufgerufen.

Destruktoraufrufe:

Die Reihenfolge der Destruktoraufrufe ist umgekehrt zum Konstruktoraufruf Reihenfolge:

  1. Abgeleiteter Klassendestruktor: Der Destruktor der abgeleiteten Klasse B wird zuerst aufgerufen.
  2. Mitgliedsfelddestruktor: Als nächstes wird der Destruktor des Mitgliedsfelds a aufgerufen und zerstört dessen Instanz von A.
  3. Basisklassen-Destruktor: Schließlich wird der Destruktor der Basisklasse A aufgerufen.

Standardinitialisierungsliste:

Auch ohne eine explizit definierte Initialisierungsliste wird das Mitgliedsfeld initialisiert, bevor der Konstruktor der abgeleiteten Klasse aufgerufen wird. In diesem Fall würde a mit dem Standardkonstruktor von A initialisiert werden.

Daher wäre die erwartete Ausgabe für den Code in der Hauptfunktion:

A() C-tor
A() C-tor
B() C-tor
~B() D-tor
~A() D-tor
~A() D-tor

Das obige ist der detaillierte Inhalt vonWie werden Konstruktoren und Destruktoren bei der C-Vererbung aufgerufen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn