我有以下两个班级。由于Child
继承自Father
,我认为Child::init()
会覆盖Father::init()
。为什么,当我执行该程序时,我得到了#34;我是父亲"而不是"我是孩子"?如何执行Child::init()
?
您可以在此处进行测试:https://ideone.com/6jFCRm
#include <iostream>
using namespace std;
class Father {
public:
void start () {
this->init();
};
void init () {
cout << "I'm the father" << endl;
};
};
class Child: public Father {
void init () {
cout << "I'm the child" << endl;
};
};
int main (int argc, char** argv) {
Child child;
child.start();
}
答案 0 :(得分:9)
目前http://localhost:3000/users/auth/facebook/callback
隐藏 Child::init
,而不是覆盖它。您的Father::init
成员函数需要init
才能获得动态调度:
virtual
或者,您可以将virtual void init () {
cout << "I'm the father" << endl;
};
标记为Child::init
以明确表示您要覆盖虚拟函数(需要C ++ 11):
override
答案 1 :(得分:3)
您应该使用函数说明符virtual
例如
#include <iostream>
using namespace std;
class Father {
public:
virtual ~Father() {}
void start () {
this->init();
};
virtual void init () const {
cout << "I'm the father" << endl;
};
};
class Child: public Father {
void init () const override {
cout << "I'm the child" << endl;
};
};
int main()
{
Child child;
child.start();
return 0;
}
否则函数start
会在其自己的类范围内搜索名称init
。并且因为函数init
不是虚拟的,它在派生类中没有被覆盖,所以调用基类函数init。
答案 2 :(得分:1)
如果您希望子项覆盖init方法,则必须在基类init
中创建virtual
方法。
class Father {
public:
void start () {
this->init();
};
virtual void init () {
cout << "I'm the father" << endl;
};
};
一个重新声明并重新实现其某个基础的虚方法的类,据说会覆盖该方法。为了对方法进行后期绑定,您需要声明该方法virtual
。