使用 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=]构造函数。
嘿,我只是想弄清楚使用基 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=]构造函数。