author:
- luixiao1223
ttile: 为多态基类声明virtual析构函数
问题:C++规定,如果一个derived class经由一个base
class指针删除。且这个base
class的析构函数是一个non-virtual的。那么这个行为是未定义的。
解决方案:给析构函数添加virtual属性。
tips
- 如果一个class含有virtual函数,那么它就该有虚析构函数
- 一个class如果不含virtual函数。那么它就不该作为base class
- 反之一个不作为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(){} // 必须提供一份定义
析构函数运作方式
- 最深derived class最先析构。
- 然后是层层析构base class