在 C11 及更高版本中使用覆盖虚拟
如果附加在函数签名的末尾,则说明符 override
在 C++ 11 以后具有特殊含义。这表示功能是
- 覆盖基类中存在的函数
- 基类功能是
virtual
这个说明符没有任何重要意义,主要是作为编译器的指示
下面的示例将演示使用不使用覆盖的行为更改。
没有 override
:
#include <iostream>
struct X {
virtual void f() { std::cout << "X::f()\n"; }
};
struct Y : X {
// Y::f() will not override X::f() because it has a different signature,
// but the compiler will accept the code (and silently ignore Y::f()).
virtual void f(int a) { std::cout << a << "\n"; }
};
与 override
:
#include <iostream>
struct X {
virtual void f() { std::cout << "X::f()\n"; }
};
struct Y : X {
// The compiler will alert you to the fact that Y::f() does not
// actually override anything.
virtual void f(int a) override { std::cout << a << "\n"; }
};
请注意,override
不是关键字,而是一个特殊的标识符,它只能出现在函数签名中。在所有其他情况下,override
仍然可以用作标识符:
void foo() {
int override = 1; // OK.
int virtual = 2; // Compilation error: keywords can't be used as identifiers.
}