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
我对以下代码有疑问:
#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