CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

关于多态的一个问题。

楼主campsun(campsun)2004-05-02 19:35:16 在 C/C++ / C++ 语言 提问

下面程序的执行结果为什么不是:  
  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

相关问题

  • 多态问题
  • java多态性
  • 多态问题
  • SCJP多态题一
  • SCJP多态题二
  • c++的多态性
  • 多态的问题
  • 类的多态性
  • 多态性,100分!!!!
  • delphi实现多态

关键词

  • 函数
  • 参数
  • 调用
  • show
  • 默认
  • pa
  • vtable
  • 实现
  • 问题
  • 结果

得分解答快速导航

  • 帖主:campsun
  • freefalcon
  • cngdzhang
  • cngdzhang
  • bshaozi
  • freefalcon

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo