为什么纯虚拟析构函数的实现必须为空?它应该是内联的吗?

Eps*_*tor 13 c++

我在其他线程中读到,当你实现一个纯虚析构函数时(是的,它可以有一个实现)它必须是空的,并且应该(?)是内联的.它应该是空的吗?如果是这样,为什么?它应该是内联的吗?如果是这样,为什么?

编辑:这是纯虚拟析构函数可以实现的方式:

class A{
    virtual ~A() = 0;
}

inline A::~A(){
    //implementation
}
Run Code Online (Sandbox Code Playgroud)

asc*_*ler 25

纯虚拟析构函数必须具有实现(假设您至少有一个具体的派生类).

没有规则纯虚拟析构函数必须具有空体.我也不知道它应该有什么理由,除了大多数破坏者应该有一个空体的相同原因.

纯虚拟析构函数可以是内联的或非内联的.我希望每个的好处取决于基类的数量和非平凡析构函数的非静态成员.

但另一个问题是:在某些流行的编译器中,如果析构函数是为类定义的唯一虚拟方法,那么将其设置为非内联是一个好主意,以帮助实现处理其多态性魔法.

  • 你在谈论"某些流行的编译器"?我觉得这个说法难以置信.请举一个具体的例子. (2认同)
  • 具体而言,g ++有什么问题?那是否有错误报告? (2认同)
  • 问题(许多编译器)是在翻译单元级别,编译器不知道是否需要析构函数,因此它必须在每个目标文件中创建副本.然后链接器可以删除所有这些副本.这在任何完全独立的编译模型中都是不可避免的.您需要一些链接时编译来解决它. (2认同)

AnT*_*AnT 8

听起来很奇怪.

首先,"是的它可以有一个实现"是一个相当奇怪的评论.它实际上需要一个实现(至少在C++ 98中).没有办法绕过它.任何使用过纯虚析构函数的人都知道它.

其次,它不应该永远是空的.它应该只是做它需要做的事情.如果您没有明确的任何事情,请将其留空.否则,它不会是空的.

最后,它可以是内联的或非内联的 - 它没有区别.真实的是它无法在类定义中定义.定义必须是非同类的(内联或不内容 - 无关紧要).


Cre*_*ind 5

您需要实现纯虚析构造函数,因为虚拟析构函数的工作方式是首先调用派生类最多的析构函数,然后调用每个基类的析构函数.这意味着编译器将生成对基类纯虚析构函数的调用,即使该类是抽象的,因此您必须为该函数提供一个主体.如果您不提供正文,则链接器会抱怨缺少符号.

可能有这种情况,即使您的类不包含任何纯虚函数,您希望您的基类是抽象的.在这里声明纯虚拟析构函数将使您的类抽象化.在这种情况下,你的析构函数可以有空体.为避免支付对空体析构函数的调用的开销,请将其声明为内联.