【问题标题】:C++ Inheritance: Virtual methods of base is invoked first and then derived method is invokedC++继承:先调用基类的虚方法,再调用派生方法
【发布时间】:2016-07-12 21:39:06
【问题描述】:

当通过基指针或指向派生类对象的基引用调用虚方法时,先调用基方法,再调用派生方法。有人可以解释为什么实现这种行为而不是直接调用派生类方法吗?

班级家长

class Parent{
    private:
        int money;
    public:
        void set_money(const int& m){
            money = m;
        }

        virtual const int& get_money() const{
            std::cout << "Parent version\n";
            return money;
        }
};

类孩子

class Child : public  Parent{
    private:
    int my_money;
    mutable int family_money;
    public:
        void set_money(const int& m){
            my_money = m;
        }

        const int& get_money() const{
            family_money = my_money + Parent::get_money();
            std::cout << "Child version\n";
            return family_money;
        }

        void set_parent_money(const int& m){
            Parent::set_money(m);
        }
};

主要

int main(){
    Child c;
    c.set_parent_money(20);
    c.set_money(50);
    Parent *p = &c;
    cout << "Pointer " << p->get_money() << endl;
    Parent& pr = c;
    cout << "Reference " << pr.get_money() << endl;
    Parent po = c;
    cout << "Object " << po.get_money() << endl;
    return 0;
}

输出

Parent version
Child version
Pointer 70
Parent version
Child version
Reference 70
Parent version
Object 20

【问题讨论】:

  • 你在子 get_money 中调用父 get_money。

标签: pointers c++11 inheritance reference virtual-functions


【解决方案1】:

不,它以正确的顺序调用。唯一的问题是您首先从Child 方法调用Parent 方法,然后打印Child 消息。如果您交换这两行,则消息将按预期显示:

        ...
        std::cout << "Child version\n";
        family_money = my_money + Parent::get_money();
         ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    相关资源
    最近更新 更多