final specifier
最后说明符%28自C++11%29
指定虚函数不能在派生类中重写或不能在继承自...
句法
当应用于成员函数时,标识符final
出现在报关员在类定义中的成员函数声明或成员函数定义的语法中。
应用于类时,标识符final
出现在类定义的开头,紧接类名之后。
declarator virt-specifier-seq(optional) pure-specifier(optional) | (1) | |
---|---|---|
declarator virt-specifier-seq(optional) function-body | (2) | |
class-key attr(optional) class-head-name class-virt-specifier(optional) base-clause(optional) | (3) | |
1%29在成员函数声明中,final
可能会在紧接声明符之后的virt-说明符-seq中出现,并且出现在纯说明符,如果使用的话。
2%29在类定义中的成员函数定义中,final
可能会出现在virt-说明符-seq中,紧接声明器之后和函数体之前。
3%29的阶级定义,final
如果使用,可以在类的名称后面,就在基子句开头的冒号之前,出现类-virt-说明符。
在%281,2%29的情况下,如果使用virt-说明符-seq,则为覆盖或final
,或final override
或override final
.在%283%29的情况下,类virt-说明符的唯一允许值(如果使用)是final
...
解释
在虚拟函数声明或定义中使用时,final
确保该函数是虚拟的,并指定它不能被派生类覆盖。程序格式不正确的%28a编译时错误生成%29,否则.
在类定义中使用时,final
指定此类可能不会出现在另一个类定义%28的基类说明符列表中,换句话说,不能从%29派生。程序格式不正确的%28a编译时错误生成%29,否则.final
也可以与联合定义,在这种情况下,除对std::is_final
%29,因为联合不能从%29派生。
final
在成员函数声明或类首中使用时具有特殊含义的标识符。在其他上下文中,它不是保留的,可以用来命名对象和函数。
例
二次
struct Base
{
virtual void foo(
};
struct A : Base
{
void foo() final; // A::foo is overridden and it is the final override
void bar() final; // Error: non-virtual function cannot be overridden or be final
};
struct B final : A // struct B is final
{
void foo() override; // Error: foo cannot be overridden as it's final in A
};
struct C : B // Error: B is final
{
};
二次
另见
- 覆盖说明符%28自C++11%29
© cppreference.com
在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。