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

C++11 C+中的最终非多态类+;11,c++11,polymorphism,overriding,final,C++11,Polymorphism,Overriding,Final,我只是想确保没有人从我的非多态类派生,所以我使用了以下语法: class Foo final { Foo(); ~Foo(); // not virtual void bar(); }; 在C++编程语言中,我读到代码>最终< /COD>可以与包含虚拟成员函数的类一起使用覆盖> /COD>。我在VS2013中尝试了我的代码示例,它编译时没有任何警告 是否允许对非多态类使用关键字final,以防止从类派生?关键字override对非多态类有意义吗?是的,即使您的类不是虚

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

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

    void bar();
};
<>在C++编程语言中,我读到<>代码>最终< /COD>可以与包含虚拟成员函数的类一起使用<代码>覆盖> /COD>。我在VS2013中尝试了我的代码示例,它编译时没有任何警告


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

是的,即使您的类不是虚拟类,也允许这样做:

参考文献:

在类定义中使用final时,指定该类可以 不出现在另一个类定义的基说明符列表中(在 换句话说,不能从中派生)


另一方面,对于非多态类,重写关键字没有意义。

< P> C++语法允许<代码>最终< /代码>出现在两个不同的地方。一个是类virt说明符,它可以出现在类声明中的类名之后,这就是您使用它的方式。尽管名称不同,但使用类virt说明符与虚拟函数无关,在非多态类中是允许的

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