使用 base class 指针调用函数?

Calling function using base class pointer?

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

#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

谁能解释为什么会这样..

简单地说,当您调用派生的 class 构造函数时,您没有初始化基 class 数据成员,因此它显示垃圾值;因为它将调用 base class 默认构造函数。

如果您按如下方式更改基础 class 默认构造函数,您将获得预期的结果。

 A():a(10) {}

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

virtual void show();

因为在您的代码中不是这种情况,编译器会将调用 a_ptr->show(); 静态绑定到 show 的 class A 实现,它打印未由 [ 初始化的成员 a =16=]构造函数。