C ++ 11中的最终非多态类

时间:2015-01-12 13:15:57

标签: c++11 polymorphism override final

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

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

    void bar();
};

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

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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

是的,即使你的班级不是虚拟的,也允许这样做:

来自cppreference的

http://en.cppreference.com/w/cpp/language/final

  

在类定义中使用时,final指定此类可以   不出现在另一个类定义的base-specifier-list中(in   换句话说,不能从中得出。

另一方面,override关键字对非多态类没有任何意义。