2009-03-17 5 views

Antwort

49

Die Reihenfolge ist:

  1. Basiskonstruktor
  2. Abgeleitet Konstruktor
  3. Abgeleitet destructor
  4. 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

+1

Vielleicht möchte das OP über Klasse D wissen: public A, B, C ... –

+1

Mehrere Vererbung fügt einige Komplexität: http://www.gotw.ca/gotw/080.htm –

9

auch bedenken, dass, während Array-Elemente zuerst konstruiert werden -> letzte, sie in umgekehrter Reihenfolge zerstört werden: letzte -> zuerst.

+1

+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. –

+0

Ist das (erwartete) templatisierte Containerverhalten und/oder das eingebaute 'new []'/'delete []' Verhalten? – franji1

2

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:

  1. Stock zugeordnet

  2. Basiskonstruktor zugeordnet Abgeleitet genannt

  3. Abgeleitet Konstruktor namens

Zerstörung:

  1. Abgeleitet destructor genannt

  2. destructor Basis genannt

  3. Basis deallokierten

  4. ausgeplant

    Abgeleitet