条款07:善用virtual析构函数
这个条款使用的场景在于,我们使用基类指针new
一个子类对象时,如果我们直接delete
则会调用基类的析构函数,那么往往会造成子类独有的一些成员没有被销毁。比如:
Base *b = new Derived();
// ...
delete b;
我们规避这样的风险的方法是将基类的析构函数声明为virtual
版本。
class Base {
public:
virtual ~Base() {...}
};
此时就没有任何风险了。
可能有的同学会过度防卫一下,将所有类的析构函数都声明为virtual
版本,这样也是不好的。
原因是如果一个类存在析构函数的话,对象的大小会马上增加一个虚函数表的大小。特别是如果这个类本身没有虚函数,也不会被用于继承时,那么添加一个虚析构函数会造成无端的内存占用。因此,我们通常的规则是:只有在类存在一个虚函数时,才将析构函数声明为虚的。