C ++覆盖继承的方法

时间:2015-10-26 15:56:23

标签: c++ oop c++11 inheritance

我有以下两个班级。由于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();
}

3 个答案:

答案 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