In welcher Reihenfolge werden die Destruktoren und Konstruktoren in C++ aufgerufen? Unter Verwendung der Beispiele einiger Basisklassen und abgeleiteten KlassenIn welcher Reihenfolge werden die Destruktoren und die Konstruktoren in C++ aufgerufen?
Antwort
Die Reihenfolge ist:
- Basiskonstruktor
- Abgeleitet Konstruktor
- Abgeleitet destructor
- Basis destructor
Beispiel:
class B
{
public:
B()
{
cout<<"Construct B"<<endl;
}
virtual ~B()
{
cout<<"Destruct B"<<endl;
}
};
class D : public B
{
public:
D()
{
cout<<"Construct D"<<endl;
}
virtual ~D()
{
cout<<"Destruct D"<<endl;
}
};
int main(int argc, char **argv)
{
D d;
return 0;
}
Ausgabe von Beispiel:
Construct B
Construct D
Destruct D
Destruct B
Mehrere Ebenen der Vererbung funktioniert wie ein Stapel:
Wenn Sie ein Element auf dem Stapel als Konstruktion betrachten schieben, und es ab, als Zerstörung nehmen, dann können Sie wie ein Stapel auf mehreren Ebenen der Vererbung aussehen.
Dies funktioniert für eine beliebige Anzahl von Ebenen.
Beispiel D2 vom D leitet leitet sich von B.
Push-B auf den Stapel schieben D auf den Stapel schieben D2 auf den Stapel. Die Konstruktionsreihenfolge lautet also B, D, D2. Dann, um die Reihenfolge der Zerstörung herauszufinden, fangen Sie an zu knallen. D2, D, B
Kompliziertere Beispiele:
Für kompliziertere Beispiele finden Sie auf den Link zur Verfügung gestellt von @JaredPar
Eine detaillierte Beschreibung dieser Ereignisse, einschließlich virtueller und Mehrfachvererbung ist verfügbar in der C++ FAQ Lite. Abschnitt 25,14 und 25,15
https://isocpp.org/wiki/faq/multiple-inheritance#mi-vi-ctor-order
Der angegebene Link ist tot . – jbx
Jetzt funktioniert der Link gut. –
auch bedenken, dass, während Array-Elemente zuerst konstruiert werden -> letzte, sie in umgekehrter Reihenfolge zerstört werden: letzte -> zuerst.
+1 Das gilt für fast alles. Ordnung der Zerstörung ist immer das Gegenteil von Konstruktion. Statische Variablen haben keine garantierte Reihenfolge der Konstruktion, aber die Zerstörung erfolgt in umgekehrter Reihenfolge. –
Ist das (erwartete) templatisierte Containerverhalten und/oder das eingebaute 'new []'/'delete []' Verhalten? – franji1
ich zu den vorherigen Antworten hinzufügen muss, weil jeder es zu sein scheint
ignorieren Wenn Sie eine abgeleitet Klasseninstanz ist erstellt, ist es wahr, dass der Code innerhalb der Konstruktor die Basis wird vor den Code innerhalb der Konstruktor desaufgerufen werden 0 abgeleitet, aber bedenken Sie, dass die abgeleitet noch „geschaffen“ technisch istvor die Basis.
Und wenn Sie die abgeleitet Klassendestruktor haben genannt zu werden, es ist wahr, dass der Code innerhalb die abgeleitete destructor vorder Code aufgerufen wird innerhalb die Basis destructor, sondern auch halten daran zu denken, dass die Basis ist zerstörtvor die abgeleitet.
Als ich sage erstellt/zerstört Ich beziehe mich tatsächlich auf zugeordnet/freigegeben. Wenn Sie sich das Speicherlayout dieser Instanzen ansehen, werden Sie sehen, dass die abgeleitete Instanz die Basisinstanz zusammensetzt. Zum Beispiel:
Speicher abgeleiteter: 0x00001110 auf 0x00001120
Memory of Base: 0x00001114 auf 0x00001118
Daher muss die abgeleitete Klasse VOR die Basis in dem Bau zugeordnet werden. Und die abgeleitete Klasse muss NACH die Basis in der Zerstörung freigegeben werden.
Wenn Sie den folgenden Code haben:
class Base
{
public:
Base()
{
std::cout << "\n Base created";
}
virtual ~Base()
{
std::cout << "\n Base destroyed";
}
}
class Derived : public Base
{
public:
Derived()
// Derived is allocated here
// then Base constructor is called to allocate base and prepare it
{
std::cout << "\n Derived created";
}
~Derived()
{
std::cout << "\n Derived destroyed";
}
// Base destructor is called here
// then Derived is deallocated
}
Also, wenn Sie Derived d;
erstellt und hatte es den Gültigkeitsbereich gehen, dann werden Sie die Ausgabe in @ Brians Antwort.Aber das Objektverhalten im Speicher ist nicht wirklich die in derselben Reihenfolge, ist es wie folgt aus:
Konstruktion:
Stock zugeordnet
Basiskonstruktor zugeordnet Abgeleitet genannt
Abgeleitet Konstruktor namens
Zerstörung:
Abgeleitet destructor genannt
destructor Basis genannt
Basis deallokierten
ausgeplant
Abgeleitet
Vielleicht möchte das OP über Klasse D wissen: public A, B, C ... –
Mehrere Vererbung fügt einige Komplexität: http://www.gotw.ca/gotw/080.htm –