条款07:善用virtual析构函数

这个条款使用的场景在于,我们使用基类指针new一个子类对象时,如果我们直接delete则会调用基类的析构函数,那么往往会造成子类独有的一些成员没有被销毁。比如:

Base *b = new Derived();
// ... 
delete b;

我们规避这样的风险的方法是将基类的析构函数声明为virtual版本。

class Base {
public:
  virtual ~Base() {...}
};

此时就没有任何风险了。

可能有的同学会过度防卫一下,将所有类的析构函数都声明为virtual版本,这样也是不好的。

原因是如果一个类存在析构函数的话,对象的大小会马上增加一个虚函数表的大小。特别是如果这个类本身没有虚函数,也不会被用于继承时,那么添加一个虚析构函数会造成无端的内存占用。因此,我们通常的规则是:只有在类存在一个虚函数时,才将析构函数声明为虚的。

results matching ""

    No results matching ""