Effective-cpp-#7

Declare destructions virtual in polymorphic base classes

动机

在某些情况下,当一个derived class对象是经由一个base class指针被删除时,而base class着一个non-virtual 的析构函数。此时实际执行的效果是,对象的derived成分并有被销毁,销毁的是base成分。这种局部销毁会造成资源泄漏。

方法

  • 一个意图被用作base class的class,应该令其析构函数为virtual。

具体用法和原因参考:虚函数的学习

  • 另外需要注意的是,一个不打算被用作base class的class,不应该令其析构函数为virtual。原因是:
    • 实现virtual函数的类的体积往往会增大50%到100%,这就造成一个问题是,该类的对象不能被塞到一个预先定义好的缓冲器里面,并传给其它语言的函数,也不能和其他语言(如C)的相同声明有着同样的结构;
    • 因此往往是只有当class内至少包含一个virtual函数,才为其声明virtual析构函数;

建议

  • 多态性质的基类应该声明virtual 函数;
  • 不作为基类使用的类,就不应该声明virtual函数;