我只是一个确保没有人会从我的非多态类派生,所以我使用以下语法:
class Foo final
{
Foo();
~Foo(); // not virtual
void bar();
};
在 C ++编程语言中,我读到final
可以与override
一起用于包含虚拟成员函数的类。我在VS 2013中尝试了我的代码示例,它在没有任何警告的情况下编译。
是否允许对非多态类使用关键字final
来阻止从类中派生?关键字override
对非多态类有意义吗?
答案 0 :(得分:4)
C ++语法允许final
出现在两个不同的地方。一个是 class-virt-specifier ,它可以出现在类声明中的类名之后,这就是你如何使用它。尽管名称如此,但使用 class-virt-specifer 与虚函数无关,并且在非多态类中是允许的。
可以使用的另一个地方是成员函数上的 virt-specifier 。如果存在, virt-specifer 序列由final
和override
中的一个或两个组成,但仅允许在虚函数上使用(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关键字对非多态类没有任何意义。