C ++:覆盖子类中的关键字

时间:2015-01-09 17:22:27

标签: c++ inheritance

我遇到以下代码的问题:

#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;
}

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

3 个答案:

答案 0 :(得分:0)

在C ++中,默认情况下成员函数不是虚拟的,它们必须是虚拟的,以便在子类中override(有或没有关键字)。所以,你的原始课程必须是:

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

否则你只是隐藏它。

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

答案 1 :(得分:0)

覆盖只是一个安全网。它告诉编译器这个方法必须存在于基类中,并且必须定义为虚拟,以便可以覆盖它。如果不满足任何这些要求,将导致编译错误。允许您覆盖方法的唯一事实是它已在基类中定义为虚拟。

答案 2 :(得分:0)

是的,override关键字/说明符只能用于覆盖虚函数。文档here