final
规范符 (自 C++11 起)
来自 cppreference.com
指定 虚函数 不能在派生类中被重写,或者指定类不能被 派生。
内容 |
[编辑] 语法
当应用于成员函数时,标识符 final
出现在类定义中成员函数声明或定义的语法中的 声明符 之后。
当应用于类 (包括结构体和联合体) 时,标识符 final
出现在类定义的开头,紧随类名之后,并且不能出现在类声明中。
声明符 virt-specifier-seq (可选) pure-specifier (可选) | (1) | ||||||||
声明符 virt-specifier-seq (可选) 函数体 | (2) | ||||||||
class-key attr (可选) class-head-name class-virt-specifier (可选) base-clause (可选) | (3) | ||||||||
2) 在类定义中的成员函数定义中,
final
可以出现在 virt-specifier-seq 中,紧随声明符之后,并在 函数体 之前。3) 在类定义中,
final
可以作为 class-virt-specifier 出现在类名之后,紧随开始 base-clause 的冒号之前 (如果使用的话)。在情况 (1,2) 中,如果使用 virt-specifier-seq,则它是 override
或 final
,或 final override
或 override final
。在情况 (3) 中,如果使用 class-virt-specifier,则其唯一允许的值是 final
。
[编辑] 解释
当在虚函数声明或定义中使用时,final 规范符确保该函数是虚函数,并指定它不能被派生类重写。否则程序将格式错误 (会生成编译时错误)。
在类定义中使用时,final 指定此类不能出现在另一个类定义的 基类说明符列表 中(换句话说,不能从其派生)。否则程序格式不正确(会生成编译时错误)。final 也可以与 联合 定义一起使用,在这种情况下它没有效果 (除了对 std::is_final 的结果有影响)(自 C++14 起),因为联合不能从其派生。
final 是一个标识符,在成员函数声明或类头部中使用时具有特殊含义。在其他上下文中,它不是保留字,可以用来命名对象和函数。
[编辑] 注意
在以下标记序列中
- class、struct 和 union 中的一个
- 一个可能限定的 标识符
- final
- : 和 { 中的一个
序列中的第三个标记 final 始终被视为一个说明符而不是标识符。
运行此代码
struct A; struct A final {}; // OK, definition of struct A, // not value-initialization of variable final struct X { struct C { constexpr operator int() { return 5; } }; struct B final : C{}; // OK, definition of nested class B, // not declaration of a bit-field member final }; // Abnormal final usage. struct final final // OK, definition of a struct named `final` from which { // you cannot inherit }; // struct final final {}; // Error: redefinition of `struct final`, NOT a // definition of a variable `final` using an elaborated // type specifier `struct final` followed by an // aggregate initialization // struct override : final {}; // Error: cannot derive from final base type; // `override` in given context is a normal name void foo() { [[maybe_unused]] final final; // OK, declaration of a variable named `final` of type // `struct final` } struct final final; // OK, declaration of a variable named `final` of type // `struct final` using an elaborated type specifier int main() { }
[编辑] 关键字
[编辑] 示例
运行此代码
struct Base { virtual void foo(); }; struct A : Base { void foo() final; // Base::foo is overridden and A::foo is the final override void bar() final; // Error: bar cannot be final as it is non-virtual }; struct B final : A // struct B is final { void foo() override; // Error: foo cannot be overridden as it is final in A }; struct C : B {}; // Error: B is final
可能的输出
main.cpp:9:10: error: 'void A::bar()' marked 'final', but is not virtual 9 | void bar() final; // Error: bar cannot be final as it is non-virtual | ^~~ main.cpp:14:10: error: virtual function 'virtual void B::foo()' overriding final function 14 | void foo() override; // Error: foo cannot be overridden as it is final in A | ^~~ main.cpp:8:10: note: overridden function is 'virtual void A::foo()' 8 | void foo() final; // Base::foo is overridden and A::foo is the final override | ^~~ main.cpp:17:8: error: cannot derive from 'final' base 'B' in derived type 'C' 17 | struct C : B // Error: B is final |
[编辑] 参考
- C++23 标准(ISO/IEC 14882:2024)
- 11 类 [class]
- 11.7.3 虚函数 [class.virtual]
- C++20 标准(ISO/IEC 14882:2020)
- 11 类 [class]
- 11.7.2 虚函数 [class.virtual]
- C++17 标准(ISO/IEC 14882:2017)
- 12 类 [class]
- 13.3 虚函数 [class.virtual]
- C++14 标准(ISO/IEC 14882:2014)
- 9 类 [class]
- 10.3 虚函数 [class.virtual]
- C++11 标准(ISO/IEC 14882:2011)
- 9 类 [class]
- 10.3 虚函数 [class.virtual]
[编辑] 缺陷报告
以下行为更改缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布的行为 | 正确行为 |
---|---|---|---|
CWG 1318 | C++11 | 一个类定义,它在类名之后有 final,以及一个 空的成员说明列表可能使 final 成为一个标识符 |
final 在这种情况下始终是一个 说明符 |
[编辑] 另请参见
override 说明符(C++11) |
显式声明方法覆盖另一个方法 |