嘿我只是想弄清楚使用基类指针来调用派生类的方法的概念,但后来我遇到了这个问题。
#include <iostream>
using namespace std;
class A {
int a;
public:
A() {}
A(int x) :a(x) {}
void show() {
cout<<"Hi this is base class ::\nvalue of a is "<<a<<endl;
}
};
class B:public A {
int b;
public:
B() {}
B(int x) : b(x) {}
void show() {
cout<<"Hi this is derived class::\n value of b is "<<b<<endl;
}
};
int main() {
A a(20), *a_ptr;
B b(10), *b_ptr;
a_ptr = &b;
a.show();
a_ptr->show();
return 0;
}
a.show()
输出:
Hi this is base class ::
value of a is 20
虽然被接受但是
a_ptr->show()
输出垃圾值
Hi this is base class ::
value of a is -1121246592
任何人都可以解释为什么会发生这种情况..
答案 0 :(得分:3)
这是因为为了具有多态性,您必须将show()
定义为虚函数,即在class A
中:
virtual void show();
由于代码中的情况并非如此,编译器将静态绑定调用的a_ptr->show();
到class A
的实现,该实现打印未由{{1初始化的成员a
构造函数。
答案 1 :(得分:0)
简单来说,当你调用派生类构造函数时,你没有初始化你的基类数据成员,因此它显示了垃圾值;因为它会调用基类的默认构造函数。
如果您按如下所示更改基类默认构造函数,则会得到预期的结果。
A():a(10) {}