2016-10-10 69 views
0

我嘗試這樣做的代碼:爲什麼C++的析構函數調用2倍

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

輸出: A(); B();〜B();〜A();〜A();

爲什麼A的析構函數調用了2次?

+7

你有複製構造和切片... – Jarod42

回答

5

創建一個臨時對象並將其複製到a(使用slicing!)後,首次銷燬開始。臨時對象(B();)正在被破壞 - 首先是~B(),然後調用其父類~A()的析構函數。然後a超出範圍並且其析構函數觸發。

相關問題