使用基类指针调用函数?

时间:2015-04-06 19:50:50

标签: c++ inheritance

嘿我只是想弄清楚使用基类指针来调用派生类的方法的概念,但后来我遇到了这个问题。

#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

任何人都可以解释为什么会发生这种情况..

2 个答案:

答案 0 :(得分:3)

这是因为为了具有多态性,您必须将show()定义为虚函数,即在class A中:

virtual void show();

由于代码中的情况并非如此,编译器将静态绑定调用的a_ptr->show();class A的实现,该实现打印未由{{1初始化的成员a构造函数。

答案 1 :(得分:0)

简单来说,当你调用派生类构造函数时,你没有初始化你的基类数据成员,因此它显示了垃圾值;因为它会调用基类的默认构造函数。

如果您按如下所示更改基类默认构造函数,则会得到预期的结果。

 A():a(10) {}