我只是为了确保没有人会从我的非多态类派生,所以我使用了以下语法:

class Foo final
{
    Foo();
    ~Foo(); // not virtual

    void bar();
};

在C++编程语言中,我读到final可以与override一起用于包含虚拟成员函数的类。我在VS 2013中尝试了代码示例,并且在编译时没有任何警告。

是否允许对非多态类使用关键字final来防止从该类派生?关键字override对非多态类有意义吗?

最佳答案

C++语法允许final出现在两个不同的位置。一个是class-virt-specifier,它可以出现在类声明中的类名称之后,这就是您使用它的方式。尽管有名称,但使用class-virt-specifer与虚拟函数无关,并且在非多态类中允许使用。

它可以使用的另一个地方是成员函数上的virt-specifier。如果存在,则virt-specifer序列由finaloverride中的一个或两个组成,但仅在虚拟函数上允许(9.2 [class.mem]“virt-specifier-seq最多应包含每个virt-specifier中的一个。 virt-specifier-seq应该仅出现在虚拟成员函数的声明中(10.3)。”)。因此override仅可用于虚函数,因此不能用于非多态类型。

09-28 01:50