Effective C++(虚析构函数)


author:

  • luixiao1223
    ttile: 为多态基类声明virtual析构函数

问题:C++规定,如果一个derived class经由一个base
class指针删除。且这个base
class的析构函数是一个non-virtual的。那么这个行为是未定义的。

解决方案:给析构函数添加virtual属性。

tips

  1. 如果一个class含有virtual函数,那么它就该有虚析构函数
  2. 一个class如果不含virtual函数。那么它就不该作为base class
  3. 反之一个不作为base class的函数。就不该有virtual 虚构函数。

容易犯错的地方

如果你不清楚一个类是否含有虚析构含糊。那么继承它会很危险。

class SpecialString: public std::string // bad idea! std::string has a non-virtual destructor
{};

SpecialString *pss =new SpecialString("Impending Doom");
std::string *ps;
ps = pss;
delete ps; // 未定义行为,因为可能导致SpecialString里面的东西不能被释放。

继承标准容器中的vector,list,set,tr1::unorderedmap都会有类似问题

抽象类

加入你有一个base class需要设置为抽象类。但是里面又没有函数。怎么做

class AWOV{
public:
    virtual ~AWOV() = 0;
};

AWOV::~AWOV(){} // 必须提供一份定义

析构函数运作方式

  1. 最深derived class最先析构。
  2. 然后是层层析构base class
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值