纯抽象类的虚拟析构函数

DDG*_*DDG 5 c++ abstract-class virtual-destructor

根据我在这里和 stackoverflow 上的其他链接上找到的内容,如果我们计划多态地使用它,我们应该始终在基类中定义一个虚拟析构函数。我想知道这个规则是否有例外。

我见过没有为纯抽象基类定义虚拟析构函数的生产代码,并且在 cppcon 2014 视频“不接受访客”之一中,大约 10:06 定义的 BoolExp 结构是一个纯抽象类,没有虚拟析构函数。

所以对于像这样定义的纯抽象类

  class Base {
      public:
         virtual foo() = 0;
         virtual bar() = 0;
     }
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们绝对必须为“基”类定义一个虚拟析构函数,即使它确实有任何数据成员?虚拟析构函数规则有任何例外吗?

提前致谢。

最好的,RG

Nat*_*ica 6

我的问题是,我们绝对必须为“基”类定义一个虚拟析构函数,即使它确实有任何数据成员?

这取决于。如果你有这样的情况

base * foo = new child(stuff);
// doing stuff
delete foo;
Run Code Online (Sandbox Code Playgroud)

那么你绝对必须有一个虚拟析构函数。没有它,您将永远不会损坏该child部件。

如果你有这样的情况

child * foo = new child(stuff);
// doing stuff
delete foo;
Run Code Online (Sandbox Code Playgroud)

那么你不需要虚拟析构函数,因为child's 将被调用。

所以规则是如果你多态删除,你需要一个多态(虚拟)析构函数,如果没有,那么你不需要