CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

c++的多态性

楼主sxw997405(sxw)2002-04-12 23:10:20 在 C/C++ / C语言 提问

请大虾们解释'动态束定'在c++中的实现!为什么虚函数实现'动态束定'与c中的swich的'静态束定'有本质区别?  
        高分奉送!!  
  问题点数:90、回复次数:14Top

1 楼skymost(李天最)回复于 2002-04-12 23:20:53 得分 5

去看<<inside   C++   object   model>>Top

2 楼k_f(凡人)回复于 2002-04-13 01:45:50 得分 0

简单说,动态绑定是在运行时binding,静态绑定是在编译时binding。Top

3 楼arya(行者)回复于 2002-04-13 03:28:07 得分 10

dynamic   binding可以看成一个动态的switch。它和静态的switch的共同点都是根据一个输入值决定流程的走向,而这个决定的规则和所有可能的走向在静态switch的情况下是编译时就决定了的,当程序编译好了,就无法改变了。而动态switch的意思是,走向是由输入值完全动态决定的。一些地址被预存在和对象关联的某处,当处理对象的时候,根据传来的对象的数据结构才能决定具体去哪。这个目的在编译期间是不为编译器所知道的。编译器也不关心这个。这就是动态switch。Top

4 楼yn_zyc_base(活着)回复于 2002-04-13 07:54:20 得分 5

用switch来理解dynamic   binding,有点困难!!!switch也是根据得到的值不同,机动的去走不同的分支,那么dynamic   binding中,也是看句柄引用实际对象来实行不现的操作???Top

5 楼coppermine(coppermine)回复于 2002-04-13 09:11:38 得分 20

静态绑定是指在编译时可就确定了被调用函数的地址,这有点像硬编码,  
  这样在程序运行时就只能调用编译时绑定的函数.  
  动态绑定是由于添加了一个中间层Vtbl,这是一个函数指针数组,编译时对函数的绑定是通过将vtbl的首地址加上一个偏移量来实现的.虽然调用一个同名虚函数时偏移量都是相同的,但是由于该位置上的函数指针可能指向不同的函数实现,于是形成了多态.    
  Top

6 楼mjm_d(菠萝蜜多)回复于 2002-04-13 21:27:59 得分 5

举个例子:  
  邮递员送信;  
  笨瓜1邮递员是为一封信每一家都去(不排除骗吃骗喝的可能)他就像switch  
  笨瓜1邮递员是看一封信的地址(虽然要自己读地址,但化不了多少时间)再去(排除在这一家大吃一顿的可能)他就像虚函数,地址写在vtable中  
   
   
  Top

7 楼Betta(小新)回复于 2002-04-15 10:28:06 得分 5

简单地说:  
  class   ISome  
  {  
  public:  
        void   Action()=0   ;  
  }   ;  
   
  void   MakeAction(ISome   *   p)  
  {  
        if(p   !=   0)  
              p->Action()   ;  
              //   Here,   the   compiler   cannot   decide   what   p->Action   is  
              //   linked,   it's   for   runtime   to   caculate  
  }  
   
  class   CSomeImplX  
  {  
  public:  
        void   Action()  
        {  
              ...  
        }  
  }   ;  
   
  void   main()  
  {  
        ISome   *   p   =   0   ;  
        CSomeImpl   oSome   ;  
        p   =   oSome   ;  
        MakeAction(p)   ;  
  }  
  Top

8 楼Betta(小新)回复于 2002-04-15 10:29:31 得分 10

oh,   sorry   for   typos:  
   
  简单地说:  
  class   ISome  
  {  
  public:  
        void   Action()=0   ;  
  }   ;  
   
  void   MakeAction(ISome   *   p)  
  {  
        if(p   !=   0)  
              p->Action()   ;  
              //   Here,   the   compiler   cannot   decide   what   p->Action   is  
              //   linked,   it's   for   runtime   to   caculate  
  }  
   
  class   CSomeImplX  
  :   public   ISome  
  {  
  public:  
        void   Action()  
        {  
              ...  
        }  
  }   ;  
   
  void   main()  
  {  
        ISome   *   p   =   0   ;  
        CSomeImplX   oSome   ;  
        p   =   &oSome   ;  
        MakeAction(p)   ;  
  }  
  Top

9 楼hammer_shi(dmresearch)回复于 2002-04-15 10:49:12 得分 5

多态是针对重载而生的。当子类重载父类成员函数时会定义virtul,这样在变异的时候就会知道调用的是那各类成员函数。由于只有等到编译的时候才能知道属于哪个类,所以叫做:滞后联编。Top

10 楼zzyy()回复于 2002-04-15 11:33:20 得分 20

再补充一点:  
  switch属于静态绑定,在编译时方法头和方法体就被编译器关联在一起,在程序中由你定义的参数决定该调用哪个对象;  
  动态绑定则相对于静态绑定而言,是在程序运行期间由消息决定你调用哪个对象。具体来说就是多态性。首先你得定义一个基类,该基类在程序运行时候不被事例化。基类至少应该包含一虚函数,它只有函数头而没有函数尸体;另外还包含一Vtb(虚函数接口表),这是一个函数指针数组,编译时对函数的绑定是通过将vtb的首地址加上一个偏移量来实现的。。。(这部分   coppermine已经讲得很清楚)这个基类的派生子类实现基类定义的虚函数,基类的Vtb则指向派生类的方法体。当你调用一个子类时,首先将消息发送到基类,由基类来判断该消息该发往哪个派生类,然后由基类对消息进行转发。所以动态绑定实际上是通过消息控制的。Top

11 楼neptunez()回复于 2002-04-15 11:34:24 得分 0

束定应该也是biding拉,dynamic   biding就是晚捆绑,基本一个意思Top

12 楼sxw997405(sxw)回复于 2002-04-18 22:22:01 得分 0

感谢各位!!请问有长沙的朋友吗?Top

13 楼zzyy()回复于 2002-04-19 11:58:37 得分 0

to   sxw997405(sxw):  
        me!Top

相关问题

  • C++多态性是如何实现的?
  • C++多态问题!求救~
  • 关于C++的多态性以及虚函数
  • 关于窗体的静态属性的用法(C#、C/S)
  • C++的多态性与重载好像作用差不多,谁能讲讲啊?
  • C++菜鸟的问题,关于多态
  • “多态性”是C++最关键和核心的一个特性,“动态绑定技术”是C++编译器最重要的一个技术!欢迎C++高手进来指正我的粗浅理解和生硬表述:
  • c#中调用c++动态库问题
  • C,C++,C#,VC 到底这些个C为什么有这么多个C?
  • c#?!?!?!

关键词

  • c++
  • 函数
  • 编译
  • 编译器
  • 指针
  • 消息
  • isome
  • 调用
  • 绑定
  • osome

得分解答快速导航

  • 帖主:sxw997405
  • skymost
  • arya
  • yn_zyc_base
  • coppermine
  • mjm_d
  • Betta
  • Betta
  • hammer_shi
  • zzyy

相关链接

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

广告也精彩

反馈

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