Effective C++中說過:
1、帶有多态性質的base class應該聲明一個virtual析構函數。如果class帶有任何virtual函數,它就應該擁有一個virtual析構函數;
2、Classes的設計目的如果不是作為base class使用, 或者不是為了具有多态性質,就不該聲明virtual 析構函數。
#ifndef __EFFECTIVE_H__
#define __EFFECTIVE_H__
/*include*/
#include <iostream>
using namespace :: std;
class baseClass
{
public :
baseClass()
{
cout << "base Class construction function" << endl;
}
~baseClass()
{
cout << "base Class destruction function" << endl;
}
};
class derivedClass : public baseClass
{
public :
derivedClass()
{
cout << "derived Class construction function" << endl;
}
~derivedClass()
{
cout << "derived Class destruction function" << endl;
}
};
#endif /*__EFFECTIVE_H__*/
baseClass是derivedClass類的基類, 同時baseClass的析構函數沒有定義為virtual。
int _tmain(int argc, _TCHAR* argv[])
{
derivedClass *pDerivedClass = new derivedClass();
baseClass *pBaseClass = pDerivedClass;
delete pBaseClass;
return 0;
}
運作結果如下:

說明:在delete pBaseClass指針時,并沒有調用derivedClass派生類的析構函數。
當derived class對象經由一個base class指針被删除,而該base class帶着一個non-virtual析構函數, 實際執行時,對象的derived成分沒有被銷毀,會造成資源洩露、資料敗壞等現象。
修複方式很簡單:
virtual ~baseClass()
{
cout << "base Class destruction function" << endl;
}
隻需要将基類baseClass的析構函數帶上一個virtual。
運作結果如下: