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 序列由 final
和 override
之一或两者组成,但只允许用于虚函数(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
只能用在虚函数上,不能用在非多态类型上。
我只是为了确保没有人会从我的非多态派生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 序列由 final
和 override
之一或两者组成,但只允许用于虚函数(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
只能用在虚函数上,不能用在非多态类型上。