若使用基類指針delete派生類對象,需將基類和派生類的析構函數聲明爲virtual

    在多態的設計中,如果準備使用基類指針delete派生類對象,需將基類和派生類的析構函數聲明爲virtual,否則程序將無法按預期工作。

幾種寫法產生的運行結果如下:
1、基類和派生類析構任一個爲virtual,另一個非virtual,程序行爲未定義,一般會產生運行時錯誤。
2、基類和派生類析構都爲非virtual,只有基類的析構被調用,派生類的析構不會被調用,一般會引起內存泄露。
3、基類和派生類析構都爲virtual,程序正常工作,派生類和基類的析構函數先後被調用。

#include <iostream>
using namespace std;

class CA
{
public:
    CA()
    
{
        cout 
<< "CA()" << endl;
    }


    
virtual ~CA()
    
{//OK
        cout << "~CA()" << endl;
    }


    
/* ~CA()
    {//ERROR
    cout << "~CA()" << endl;
    }
    
*/

}
;

class CB : public CA
{
public:
    CB()
    
{
        cout 
<< "CB()" << endl;
    }

    
virtual ~CB()
    
{//OK
        cout << "~CB()" << endl;
    }

    
/* ~CB()
    {//ERROR
    cout << "~CB()" << endl;
    }
    
*/

}
;

int _tmain(int argc, _TCHAR* argv[])
{
    CA 
*pa = new CB();
    delete pa;
    
return 0;
}

 
發佈了33 篇原創文章 · 獲贊 7 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章