什麼時候需要虛析構函數

什麼時候需要虛析構函數     選擇自 jackieyoung 的 Blog
關鍵字   什麼時候需要虛析構函數
出處  
  答案:當你的類準備給別人繼承時要提供虛析構函數
考慮下面例子:
class A
{
public:
 A(){cout << "In A constructor" << endl;}
 ~A(){cout << "In A destructor" << endl;}
};

class B : public A
{
public:
 B()
 {
 cout << "In B constructor" << endl;
 m_p = new char[10];
 }
 ~B()
 {
 cout << "In B destructor" << endl;
 if (m_p) delete [] m_p;
 }
private:
 char *m_p;
};

int main(int argc, char* argv[])
{
 //printf("Hello World!/n");
 A *p = new B;
 delete p;

 return 0;
}
輸出結果:
In A constructor
In B constructor
In A destructor

並沒有調用B的析構函數,new出來的內存沒有及時回收造成內存泄漏。
要解決這個問題,只要將A的析構函數定義爲虛函數:~A(){cout << "In A destructor" << endl;}。爲什麼定義爲虛函數就能解決呢?我是這樣理解的:
象其它虛構函數一樣,~B()重定義(overridden)了~A(),這樣指向派生類的指針就能根據運行時的狀態調用B的析構函數了。這裏又有一個問題:爲什麼還會調用A的析構函數呢?我只能理解爲析構函數是一個特殊的函數,由系統維護其機制。就像B.~A()是錯誤而B.~B()(雖然邏輯上不對,但語法上是正確的,編譯運行完全沒問題)是正確的一樣。

Any idea for this?

相關文章

對該文的評論
yjgx007 ( 2005-01-14)
quote: effective C++
c++語言標準關於這個問題的闡述非常清楚:當通過基類的指針去刪除派生類的對象,而基類又沒有虛析構函數時,結果將是不可確定的。
......
聲明析構函數爲虛就會帶來你所希望的運行良好的行爲:對象內存釋放時,派生類enemytank和基類enemytarget的析構函數都會被調用。

======================================
對於定義基類的析構函數爲虛函數, 我的理解是, 在從派生類類型至基類類型轉換後,在析構過程中也能確保派生類和基類的析構函數均被調用!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章