C++:重写子类中的关键字

C++: Override keywoard in Sub-subclasses

我对以下代码有疑问:

#include <iostream>

using namespace std;

class C1 {
  public:
  void f() { cout << "something" <<endl; }
};

class C2 : public C1 {
  // void f() { cout << "something more " << endl;}    // no f implementation here
};

class C3 : public C2 {
public:
  void f() { cout << "something else" <<endl; }

};

int main() {
  C1 c1;
  C3 c3;
  c1.f();      // outputs "something"
  c3.f();      // outputs "something else"
  return 0;
}

这很好用。但是如果我用 override 标记 C3::f() 它不会编译 (example on ideone)。有谁知道为什么会这样?显然我在这里成功覆盖了函数 f!?我是否误解了 override 关键字的意思?

在 C++ 中,默认情况下成员函数不是虚函数,它们必须是虚函数才能在子 classes 中 override 它们(带或不带关键字)。所以,你原来的 class 需要是:

class C1 {
  public:
  virtual void f() { cout << "something" <<endl; }
};

否则你只是在隐藏它。

此外,覆盖是相当新的 - 确保您使用正确的选项来调用 c++11。

Override 只是一个安全网。它告诉编译器这个方法必须存在于基 class 中并且必须被定义为虚拟的以便它可以被覆盖。如果不满足这些要求中的任何一个,就会导致编译错误。让你覆盖一个方法的只是它在基class.

中被定义为虚拟的事实

是的,覆盖 keyword/specifier 只能用于覆盖虚函数。文档 here