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