我遇到以下代码的问题:
#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
关键字的想法?
答案 0 :(得分:0)
在C ++中,默认情况下成员函数不是虚拟的,它们必须是虚拟的,以便在子类中override
(有或没有关键字)。所以,你的原始课程必须是:
class C1 {
public:
virtual void f() { cout << "something" <<endl; }
};
否则你只是隐藏它。
此外,覆盖是相当新的 - 请确保您使用适当的选项来调用c ++ 11。
答案 1 :(得分:0)
覆盖只是一个安全网。它告诉编译器这个方法必须存在于基类中,并且必须定义为虚拟,以便可以覆盖它。如果不满足任何这些要求,将导致编译错误。允许您覆盖方法的唯一事实是它已在基类中定义为虚拟。
答案 2 :(得分:0)
是的,override关键字/说明符只能用于覆盖虚函数。文档here