繁体   English   中英

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

[英]Why must a pure virtual destructor's implementation be empty? And should it be inline?

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

编辑:这是纯虚拟描述符的实现方式:

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

inline A::~A(){
    //implementation
}

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

没有规则规定纯虚拟析构函数必须具有空主体。 除了大多数析构函数应该具有空主体的相同原因外,我也不知道应该这样做。

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

但是,还有一个问题:在某些流行的编译器上,如果析构函数是为该类定义的唯一虚拟方法,则最好使其非内联,以帮助实现处理其多态性魔术。

听起来很奇怪。

首先,“是的,它可以实现”是一个很奇怪的说法。 实际上需要具有实现(至少在C ++ 98中)。 没有办法解决。 任何使用过纯虚拟析构函数的人都知道。

其次,它不应该总是为空。 它只是应该做它需要做的事情。 如果您在此处无事可做,请将其留空。 否则,它将不会为空。

最后,它可以是内联或非内联-没什么区别。 确实是不能在类定义中定义它。 该定义必须是一流的(内联与否-无关紧要)。

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

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

请记住,“必须”和“应该”意味着不同的含义...

纯虚拟析构函数可以是非空的。 不知道谁可能会说其他话。

应该是吗 是的,因为抽象库不应删除任何内容。 您会发现您有时会违反后者的“应该”,因此当然也可能违反后者。

应该是内联的吗? 它既不也不应该。 我想不出通过“内联”可以明显获得任何收益,因为实现都可以随意忽略内联和内联非内联。 通常,虽然没有理由只创建抽象类中的空析构函数来实现文件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM