在多態的設計中,如果準備使用基類指針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;
}
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;
}