我有以下课程
#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()方法吗?如果这是应该的,我怎样才能获得我想要的行为?
答案 0 :(得分:6)
您需要将get_number
标记为virtual
才能生效。
在C ++中,您可以获得所付出的代价。由于多态性增加了开销(内存和运行时 - 指向虚方法表和动态调度的指针),因此必须明确要求在运行时解析哪些函数调用。由于get_number
不是virtual
,因此tell_me_the_number
的调用将在编译时解析,并且将调用基类版本。