在 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.
}