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

Final non-polymorphic class in C++11

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

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

    void bar();
};

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

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

是的,即使您的 class 不是虚拟的,也是允许的:

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

When used in a class definition, final specifies that this class may not appear in the base-specifier-list of another class definition (in other words, cannot be derived from).

另一方面,override 关键字对于非多态 classes 没有意义。

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

另一个可以使用它的地方是成员函数上的 virt-specifier。如果存在,virt-specifer 序列由 finaloverride 之一或两者组成,但只允许用于虚函数(9.2 [class.mem] "A virt-specifier-seq shall contain at most one of each virt-specifier. A virt-specifier-seq shall appear only in the declaration of a virtual member function (10.3).")。所以override只能用在虚函数上,不能用在非多态类型上。