//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或其他语言函数相同的声明结构,因为他们并不具有虚表,除非专门为他们去进行设计,而这本身的实现细节将导致代码无法移植。所以,当且仅当类里至少包含一个虚函数时才去声明虚析构函数是比较可行的做法。