命名空间
变体
操作

final 规范符 (自 C++11 起)

来自 cppreference.com
< cpp‎ | 语言
 
 
C++ 语言
表达式
备用表示形式
字面量
布尔值 - 整数 - 浮点数
字符 - 字符串 - nullptr (C++11)
用户定义的 (C++11)
实用工具
属性 (C++11)
类型
typedef 声明
类型别名声明 (C++11)
强制转换
内存分配
特定于类的函数属性
虚函数
override 规范符 (C++11)  
final 规范符 (C++11)
explicit (C++11)
static

特殊成员函数
模板
杂项
 
 

指定 虚函数 不能在派生类中被重写,或者指定类不能被 派生

内容

[编辑] 语法

当应用于成员函数时,标识符 final 出现在类定义中成员函数声明或定义的语法中的 声明符 之后。

当应用于类 (包括结构体和联合体) 时,标识符 final 出现在类定义的开头,紧随类名之后,并且不能出现在类声明中。

声明符 virt-specifier-seq (可选) pure-specifier (可选) (1)
声明符 virt-specifier-seq (可选) 函数体 (2)
class-key attr (可选) class-head-name class-virt-specifier (可选) base-clause (可选) (3)
1) 在成员函数声明中,final 可以出现在 virt-specifier-seq 中,紧随声明符之后,并在 pure-specifier 之前 (如果使用的话)。
2) 在类定义中的成员函数定义中,final 可以出现在 virt-specifier-seq 中,紧随声明符之后,并在 函数体 之前。
3) 在类定义中,final 可以作为 class-virt-specifier 出现在类名之后,紧随开始 base-clause 的冒号之前 (如果使用的话)。

在情况 (1,2) 中,如果使用 virt-specifier-seq,则它是 overridefinal,或 final overrideoverride final。在情况 (3) 中,如果使用 class-virt-specifier,则其唯一允许的值是 final

[编辑] 解释

当在虚函数声明或定义中使用时,final 规范符确保该函数是虚函数,并指定它不能被派生类重写。否则程序将格式错误 (会生成编译时错误)。

在类定义中使用时,final 指定此类不能出现在另一个类定义的 基类说明符列表 中(换句话说,不能从其派生)。否则程序格式不正确(会生成编译时错误)。final 也可以与 联合 定义一起使用,在这种情况下它没有效果 (除了对 std::is_final 的结果有影响)(自 C++14 起),因为联合不能从其派生。

final 是一个标识符,在成员函数声明或类头部中使用时具有特殊含义。在其他上下文中,它不是保留字,可以用来命名对象和函数。

[编辑] 注意

在以下标记序列中

  1. classstructunion 中的一个
  2. 一个可能限定的 标识符
  3. final
  4. :{ 中的一个

序列中的第三个标记 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()
{
}

[编辑] 关键字

final

[编辑] 示例

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) 显式声明方法覆盖另一个方法 [编辑]