为什么这个继承失败(使用超类的方法)C ++

时间:2013-05-27 21:15:16

标签: c++ inheritance method-overriding

我有以下课程

#include <iostream>

using namespace std;

class A {
public:
    int get_number() {return 1;}
    void tell_me_the_number() {
        cout << "the number is " << get_number() <<"\n";
    }
};

class B: public A {
public:
    int get_number() {return 2;}
};


int main() {
    A a;
    B b;
    a.tell_me_the_number();
    b.tell_me_the_number();
}

我希望这会输出给我:

the number is 1
the number is 2

但实际上我得到了1号线的两倍。

当它是B类时,不应该调用B类的get_number()方法吗?如果这是应该的,我怎样才能获得我想要的行为?

1 个答案:

答案 0 :(得分:6)

您需要将get_number标记为virtual才能生效。

在C ++中,您可以获得所付出的代价。由于多态性增加了开销(内存和运行时 - 指向虚方法表和动态调度的指针),因此必须明确要求在运行时解析哪些函数调用。由于get_number不是virtual,因此tell_me_the_number的调用将在编译时解析,并且将调用基类版本。