关于多态的一个问题。
下面程序的执行结果为什么不是:
B: b=77
C: c=999
C: c=999
而是:
B: b=77
C: c=145
C: c=145
#include<iostream.h>
class A{ public:
virtual void show(int a=145){cout<<"A: a="<<a<<endl; }
};
class B:public A
{ public:
void show(int b){ cout<<"B: b="<<b<<endl; }
};
class C:public B
{ public:
void show(int c=999){ cout<<"C: c="<<c<<endl; }
};
class D:public C
{ public:
void show(){ cout<<"D:\n"; }
};
void main()
{ A a,*pa=&a;
B b; C c; D d;
pa=&b; pa->show(77);
pa=&c; pa->show();
pa=&d; pa->show();
}
/*执行结果:B: b=77
C: c=145
C: c=145 */
问题点数:20、回复次数:9Top
1 楼THEBEST(你厉害!)回复于 2004-05-02 19:39:23 得分 0
唉。。。。。。。
到处问作业题。Top
2 楼freefalcon(心宇—消失中...)回复于 2004-05-02 19:41:16 得分 5
是啊
这个问题都看见很多次了
因为默认参数是静态决定的
pa的类型是A*,所以默认参数便选择了A类里面的145Top
3 楼campsun(campsun)回复于 2004-05-02 19:54:15 得分 0
谢谢~!
不过我还是不太明白。
关于D的问题。
D.show()不是相当于对于A.show()实现了多态么?
那为什么实际结果却是调用了C.show()?
盼freefalcon答复。Top
4 楼cngdzhang()回复于 2004-05-02 20:02:39 得分 5
因为
D中的 show() ,不包含任何参数,所以在调用show();时,D的会隐藏前面的
virtual void show()
由
pa=&d; pa->show();
ps是A*指针它会调用最大化的虚函数实现版本,就是C的了
因为virtual void show(int)是含参数的
其实,这段程序你用TC(3.0)编译,会看到警告信息的
Top
5 楼cngdzhang()回复于 2004-05-02 20:08:55 得分 5
需函数的调用实际上是有一个叫 vTable 的函数跳转表的,里面是一些虚函数的入口地址,,每个类都有自己的vtable的,从而实现C++运行时的多态
但是vtable不包含默认参数表,因为pa是A*,从而选择了A的,输出是145,Top
6 楼bshaozi(俺们那噶不学c!)回复于 2004-05-02 20:47:37 得分 1
又学到了一招~Top
7 楼freefalcon(心宇—消失中...)回复于 2004-05-02 21:00:19 得分 4
D.show()不是相当于对于A.show()实现了多态么?
那为什么实际结果却是调用了C.show()?
多态要求函数的原型必须一致(包括函数名、参数表、返回类型),无参数和使用默认参数是不一样的Top
8 楼campsun(campsun)回复于 2004-05-02 21:07:09 得分 0
我一直以为 show(int a=1)是包含了两个函数原型。
show() 和 show(int)呢。
谢谢大家的指点。马上结贴。Top
9 楼zmpcoming((我来学习!))回复于 2004-09-03 15:18:11 得分 0
学习Top




