c++ 虚拟析构函数是否继承?

如果我有一个基类有一个虚拟析构函数。有一个派生类也声明一个虚拟析构函数?

class base {
public:
    virtual ~base () {}
};

class derived : base {
public:
    virtual ~derived () {} // 1)
    ~derived () {}  // 2)
};

具体问题:

>是1)和2)一样吗?是2)自动虚拟,因为它的基础或者它“停止”的虚拟?
>如果他没有什么可以省略衍生的析构函数?
>声明派生析构函数的最佳实践是什么?声明它是虚拟的,非虚拟的或者如果可能的话忽略它?

最佳答案
>是的,他们是一样的。派生类不声明虚拟的东西不会阻止它虚拟。事实上,没有办法阻止任何方法(包括析构函数)在派生类中是虚拟的,如果它是基类中的虚函数。
>是的,如果没有什么可以省略一个派生类中的析构函数。它的虚拟是否是无关紧要的。
>如果可能,我会省略。为了清楚起见,我总是使用virtual关键字再次为派生类中的虚函数。人们不应该一直沿着继承层次结构去弄清楚一个函数是虚拟的。

作为项目3的一个小点。在评论中已经指出,如果析构函数是未声明的,编译器生成一个默认的(仍然是虚拟的)。而默认的是内联函数。

内联函数可能会将更多的程序暴露给程序的其他部分,使共享库的二进制兼容性变得棘手。此外,增加的耦合可导致面对某些种类的很多重新编译。例如,如果你决定你真的想要一个实现你的虚拟析构函数,那么调用它的每一段代码都需要重新编译。而如果你已经在类体中声明它,然后在.cpp文件中将其定义为空,那么您将很好地更改它而不重新编译。

我的个人选择仍然是在可能的时候省略它。在我看来,它杂乱的代码,编译器有时可以做一些更高效的事情与默认实现在空的。但有一些约束,你可能会使一个不好的选择。

转载注明原文:c++ 虚拟析构函数是否继承? - 代码日志