2007年4月全国计算机二级C++选择题30道,为什么结果是10,20

来源:百度知道 编辑:UC知道 时间:2024/05/16 11:46:48
#include <iostream>
using namespace std;
class Base {
int a,b;
public:
Base(int x,int y) { a=x; b=y;}
void show() { cout<<a<<','<<b<<endl;}
};
class Derived: pbulic Base {
int c,d;
public:
Derived(int x,int y,int z,int m):Base(x,y) {c=z; d=m;}
void show() {cout << c<<','<<d<<endl;}};
int main()()
{ Base B1(50,50),*pb;
derived D1(10,20,30,40);
pb=&D1;
pb->show();
return 0;
}这道不知道为什么结果是10,20。为什么不是30,40呢?请各位帮忙分析分析,谢谢!

2个地方需要看:
derived D1(10,20,30,40);//先走的是父亲的构造,把之前的5050替代成10,20了之后才
pb->show(); //调用的是父类的。
简略提示+自己琢磨才能真懂。

show();函数不是虚拟函数,通过指向子类对象的父类指针是不会直接调用它的。除非强制转化类型。现在的代码中,调用时是当作父类对象操作的。

你在class Base把它变成virtual void show试试!呵呵。

D1是子类对象,它构造时就将父类的x,y初始化为10,20了。因为show()不是函数,所以当指向子类的指针*PB调用show()时,只能调用父类的show()函数。如果你将父类的show()改为虚函数,也就是virtual show()时,那么pb->show()输出的将是30,40.