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