//base.h 基類聲明文件
class CBase
{
public:
virtual ~CBase() = 0;
}
// sub.h 子類聲明文件
#include "base.h"
class CSub : public CBase
{
public:
CSub();
~CSub();
}
// sub.cpp 子類實現文件
#include "sub.h"
CBase::~CBase()
{
}
CSub::CSub()
{
}
CSub::~CSub()
{
}
注:1、即使基類的析構函數是純虛的,也必須要實現,因爲在銷燬一個子類的對象,會從基類的開始調用。
2、如果基類的析構函數未聲明爲虛函數,則當子類的實例轉換爲基類的類型進行銷燬時,不會執行子類的析構函數,程序將產生不確定的行爲。
3、當一個類不準備作爲基類使用時 ,使析構函數爲虛一般是個壞主意。
如:
class CPoint
{
public:
CPoint(short int x, short int y);
~CPoint()
protected:
short int m_x,m_y;
}
一個short int佔16位,一個CPoint對象剛好適合放進一個32位的寄存器中。正好作爲一個32位的數據傳給C或其他語言寫的函數,但如果聲明爲虛析構函數就會產生vptr(虛函數表),增加額外的空間,則不具有和C或其他語言函數相同的聲明結構,因爲他們並不具有虛表,除非專門爲他們去進行設計,而這本身的實現細節將導致代碼無法移植。所以,當且僅當類裏至少包含一個虛函數時纔去聲明虛析構函數是比較可行的做法。