析构函数可以是最终的吗?

Posted

技术标签:

【中文标题】析构函数可以是最终的吗?【英文标题】:May a destructor be final? 【发布时间】:2018-05-13 08:51:12 【问题描述】:

C++ 标准是否允许将析构函数声明为final?像这样:

 class Derived: public Base
 
      ...
      virtual ~Derived() final;
 

如果是这样,那是否会阻止派生类的声明:

 class FurtherDerived: public Derived // allowed?
 

如果允许,编译器是否可能发出警告?将析构函数声明为final 是否是一个可行的习惯用法,用于指示一个类不打算用作基类?

(有no point in doing this in a ultimate base class,只有派生类。)

【问题讨论】:

表示一个类不打算用作基础的习惯用法是使该类成为最终类。 如果你打算指出一个类不适合被继承,你可以标记整个类finalclass Devired final : public Base 【参考方案1】:

可以将 C++ 析构函数声明为 final

是的。

如果是这样,那是否会阻止派生类的声明:

是的,因为派生类必须声明一个析构函数(由您显式或由编译器隐式),并且该析构函数将覆盖声明为 final 的函数,该函数格式不正确。

规则是[class.virtual]/4:

如果某个类 B 中的虚函数 fvirt-specifier final 标记,并且在从 B 派生的类 D 中,函数 D​::​f 覆盖 B​::​f,则程序格式不正确。

这是不正确的推导本身,它不必使用。

将析构函数声明为 final 是否是表明一个类不打算用作基类的可行习惯用法?

有效,但你应该只标记类final。它更明确一些。

【讨论】:

"...但你应该只标记类final"。还有doing both would be redundant.

以上是关于析构函数可以是最终的吗?的主要内容,如果未能解决你的问题,请参考以下文章

没有虚拟构造函数,只有虚拟析构函数

虚析构函数与纯虚函数

有没有自动化的方法来实现构造函数后和析构函数前的虚拟方法调用?

使用析构函数完成任务

ccombobox析构函数会自动清空列表框吗

c++ 析构函数 是在啥时候执行