关于虚析构函数

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值