2016-10-10 2 views
0

ich diesen Code versucht:Warum C++ destructor bei Vererbung aufgerufen 2 mal

#include <iostream> 
using namespace std; 

class A { 
public: 
A(){cout<<"A();";} 
~A(){cout<<"~A();";} 
}; 

class B : public A { 
public: 
B(){cout<<"B();";} 
~B(){cout<<"~B();";} 
}; 

int main() { 
A a =B(); 
return 0; 
} 

Ausgang: A(), B(); ~ B(); ~ A(); ~ A();

Warum wird der Destruktor von A zweimal aufgerufen?

+7

Sie haben Kopier-Constructor und Slicing ... – Jarod42

Antwort

5

Nachdem Sie ein temporäres Objekt erstellt haben, das in (mit slicing!) Kopiert wird, beginnt die erste Zerstörung. Ein temporäres Objekt (B();) wird zerstört - zuerst ~B() und dann wird der Destruktor seiner Elternklasse ~A() aufgerufen. Dann geht a außerhalb des Geltungsbereichs und sein Destruktor wird ausgelöst.

Verwandte Themen