Namespaces
Variants

override specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Virtual function
override specifier (C++11)
final specifier (C++11)
Special member functions
Templates
Miscellaneous

指定某个 虚函数 重写另一个虚函数。

目录

语法

标识符 override (若使用)应紧跟在类定义中成员函数声明或成员函数定义的 声明符 之后。

declarator virt-specifier-seq  (可选) pure-specifier  (可选) (1)
declarator virt-specifier-seq  (可选) function-body (2)
1) 在成员函数声明中, override 可出现在声明符之后的 virt-specifier-seq 中,若使用纯说明符,则位于 pure-specifier 之前。
2) 在类定义内部的成员函数定义中, override 可以出现在声明符之后、 函数体 之前的 虚函数说明符序列 中。

在这两种情况下, virt-specifier-seq (若使用)可以是 override final ,也可以是 final override override final

说明

在成员函数声明或定义中, override 说明符确保该函数为虚函数并正在重写基类中的虚函数。若此条件不成立,则程序非良构(将产生编译时错误)。

override 是一个 具有特殊含义的标识符 ,当用于成员函数声明符之后时;否则它并非保留的 关键字

关键词

override

示例

#include <iostream>
struct A
{
    virtual void foo();
    void bar();
    virtual ~A();
};
// 结构体A的成员函数定义:
void A::foo() { std::cout << "A::foo();\n"; }
A::~A() { std::cout << "A::~A();\n"; }
struct B : A
{
//  void foo() const override; // 错误:B::foo 未覆盖 A::foo
                               // (签名不匹配)
    void foo() override; // 正确:B::foo 覆盖 A::foo
//  void bar() override; // 错误:A::bar 不是虚函数
    ~B() override; // 正确:`override` 也可用于虚
                   // 特殊成员函数,例如析构函数
    void override(); // 正确,成员函数名,非保留关键字
};
// 结构体B的成员函数定义:
void B::foo() { std::cout << "B::foo();\n"; }
B::~B() { std::cout << "B::~B();\n"; }
void B::override() { std::cout << "B::override();\n"; }
int main()
{
    B b;
    b.foo();
    b.override(); // 正确,调用成员函数 `override()`
    int override{42}; // 正确,定义整型变量
    std::cout << "override: " << override << '\n';
}

输出:

B::foo();
B::override();
override: 42
B::~B();
A::~A();

参见

final 说明符 (C++11) 声明方法不可被重写或类不可被继承