|
|||||
答案:當你的類準備給別人繼承時要提供虛析構函數 考慮下面例子: 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? 相關文章
|
|