override
specifier
(since C++11)
| 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 | ||||||||||||||||
|
||||||||||||||||
| 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 | ||||||||||||||||
|
||||||||||||||||
| Special member functions | ||||||||||||||||
|
||||||||||||||||
| Templates | ||||||||||||||||
| Miscellaneous | ||||||||||||||||
| General | ||||
| Overview | ||||
class
/
struct
types
|
||||
union
types
|
||||
| Injected-class-name | ||||
| Class property specifiers (C++26) | ||||
| Members | ||||
| Data members | ||||
| Static members | ||||
The
this
pointer
|
||||
| Nested classes | ||||
| Member templates | ||||
| Bit-fields | ||||
using
-declarations
|
||||
| Member functions | ||||
| Member access specifiers | ||||
| Constructors and member initializer lists | ||||
| Default member initializer (C++11) | ||||
friend
specifier
|
||||
explicit
specifier
|
||||
| Converting constructor | ||||
| Special member functions | ||||
| Default constructor | ||||
| Copy constructor | ||||
| Move constructor (C++11) | ||||
| Copy assignment operator | ||||
| Move assignment operator (C++11) | ||||
| Destructor | ||||
| Inheritance | ||||
| Base and derived classes | ||||
| Empty base optimization (EBO) | ||||
| Virtual member functions | ||||
| Pure virtual functions and abstract classes | ||||
override
specifier
(C++11)
|
||||
final
specifier
(C++11)
|
指定某个 虚函数 重写另一个虚函数。
目录 |
语法
标识符
override
(若使用)应紧跟在类定义中成员函数声明或成员函数定义的
声明符
之后。
| declarator virt-specifier-seq (可选) pure-specifier (可选) | (1) | ||||||||
| declarator virt-specifier-seq (可选) function-body | (2) | ||||||||
override
可以出现在声明符之后、
函数体
之前的
虚函数说明符序列
中。
在这两种情况下,
virt-specifier-seq
(若使用)可以是
override
或
final
,也可以是
final override
或
override final
。
说明
在成员函数声明或定义中, 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)
|
声明方法不可被重写或类不可被继承 |