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

May a destructor be final?

提问人:Raedwald 提问时间:11/29/2017 最后编辑:Raedwald 更新时间:11/30/2017 访问量:6499

问:

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

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

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

 class FurtherDerived: public Derived {// allowed?
 }

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

在终极基类中执行此操作没有意义,而只是在派生类中执行此操作。

C++ C++11 继承 析构函数

评论

3赞 juanchopanza 11/29/2017
表示一个类不打算用作基础的成语是使该类成为最终的。
7赞 François Andrieux 11/29/2017
如果你打算指出一个类不适合作为继承的类,你可以直接标记整个类。finalclass Devired final : public Base

答:

64赞 Barry 11/29/2017 #1

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

是的。

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

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

规则为 [class.virtual]/4

如果某个类 B 中的虚函数用 virt-specifier 标记,而在派生自 B 的类 D 中,函数会覆盖,则程序的格式不正确。ffinalD​::​fB​::​f

是推导本身格式不正确,它不必被使用。

将析构函数声明为 final 是否是一个可行的习惯用语,用于指示类不打算用作基类?

有效,但您应该只标记类.这要明确得多。final

评论

14赞 Raedwald 11/29/2017
"...但你应该只标记类”。两者兼而有之将是多余的final