动态绑定的心得

原创 2001年03月16日 09:08:00

    我前不久看了遍《thinking in C++》对动态绑定有了点心得,说出来与大家分享。

 如果一个基类(没有父类)含有虚函数,那么在编译时,编译器会生成一张虚函数表,表里是该类中所有虚函数的地址(按出现顺序排列);并且会在该类中动态的插入一个成员变量(__vfptr),它是一个指向这个虚函数表的指针。对于这个基类的所有子类,编译器都会生成各自的虚函数表,并且把继承得来的__vfptr指针指向它。例如 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

class BB{

public:

   BB();

   virtual ~BB();

   virtual void f1(){ cout << "BB"<< endl; };

};//BB的虚函数表中的一个函数是~BB(),第二个是f1();

class DD : public BB{

public:

   DD();

   virtual ~DD();    //表中的第一个函数

   virtual void f1(){ cout << "DD"<< endl; };//第二个

};

BB的虚函数表中的一个函数是~DD(),第二个是DD的f1();如果BB没有定义f1()而定义了//virtual f2();则第二个函数是BB的f1(),第三个是f2();如果有以下的调用:

   DD dd;

   BB* pBB = &dd;

   pBB->f1();    //输出的是"DD"

 

因为编译器对pBB->f1() 不是直接CALL f1的地址,而是类似于:

mov  ecx,  dword ptr [ebp-20h];//pBB变量的内容=类的首址=__vfptr的地址

mov  edx,  dword ptr [ecx];    //__vfptr的内容 = vtable的首地址

call dword ptr [edx+4]   //调用虚函数表的第二个函数:就是dd.f1()

例如class CC{

public:

   CC();

   virtual ~CC();

   virtual void f2(){cout << "CC" << endl;};

};

 

class DD: public BB, public CC{...}

 

有以下调用:

   DD dd;

   void* pCC = (CC*)&dd;    //关键在这一句!!!

   BB* pBB = (BB*)pCC;

   pBB->f1();   //竟然输出是"cc",就是说调用的是CC::f2()!!!

   这是因为:dd内有两个__vfptr(一个是BB的,一个是CC的)分别在在dd对象数据空间的前两位,都指向DD的虚函数表。    其实在第二句pCC指向的是第二个__vfptr(CC的),根据上面的汇编代码,可知编译器对pBB->f1()的解释就是调用"那个"虚函数表的第二个函数(因为f1()在BB的第二个),而"那个"虚函数表现在已经是CC的了。

java多态总结以及动态绑定机制

什么是多态? 1.继承体现了多态,JAVA里没有多继承,一个类之能有一个父类。而继承的表现就是多态。一个父类可以有多个子类,而在子类里可以重写父类的方法(例如方法print()),这样每个子类里重写...
  • yuliangliang092
  • yuliangliang092
  • 2016年07月19日 00:35
  • 736

关于多态以及动态绑定

数据抽象,继承,多态是java的三大特征,可见理解多态对于学习java的重要性,多态不但能够改善代码的组织结构和可读性,还能够让程序更加的具有可拓展性。        理解一下什么是多态。多态就是...
  • zcxwww
  • zcxwww
  • 2016年05月03日 14:59
  • 1935

动态绑定实现机制

来源:伯乐在线专栏作者-陶邦仁 Java虚拟机调用一个类方法时,它会基于对象引用的类型(通常在编译时可知)来选择所调用的方法。相反,当虚拟机调用一个实例方法时,它会基于对象实际的类型(只能在...
  • u011687186
  • u011687186
  • 2016年05月10日 11:46
  • 653

OC中的动态绑定与多态问题

1.什么是多态? 程序中的多态:不同的对象以自己的方式响应相同名称方法的能力称为多态  2.多态的条件  多态的条件:有继承关系、有方法重写、父类的声明变量指向子类对象。  ...
  • ld81516741
  • ld81516741
  • 2015年08月27日 23:01
  • 395

C++学习笔记(15)——静态绑定与动态绑定

本博客(http://blog.csdn.net/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                      ...
  • livelylittlefish
  • livelylittlefish
  • 2008年03月12日 00:25
  • 15475

java深入理解动态绑定

在面向对象的程序设计语言中,多态是继数据抽象和继承之后的第三种基本特性。多态通过分离做什么和怎么做,从另一个角度将接口和实现分离开来。在一开始接触多态这个词的时候,我们或许会因为这个词本身而感到困惑,...
  • QuinnNorris
  • QuinnNorris
  • 2017年02月26日 15:38
  • 783

c++中动态绑定的技术实现

转自http://www.cnblogs.com/hustdc/p/6485913.html1 什么是动态绑定  有一个基类,两个派生类,基类有一个virtual函数,两个派生类都覆盖了这个虚函数。现...
  • Cristal_tina
  • Cristal_tina
  • 2017年07月20日 10:20
  • 163

多态(动态绑定)

多态(动态绑定)
  • sinat_25398439
  • sinat_25398439
  • 2016年11月15日 10:29
  • 469

C++动态绑定和虚函数表vtable (动态实现原理)

关于C++内部如何实现多态,对程序员来说即使不知道也没关系,但是如果你想加深对多态的理解,写出优秀的代码,那么这一节就具有重要的意义。 我们知道,函数调用实际上是执行函数体中的代码。函数体是内存中的一...
  • zhanghow
  • zhanghow
  • 2016年12月12日 21:38
  • 779

Java静态绑定与动态绑定

程序绑定的概念: 绑定指的是一个方法的调用与方法所在的类(方法主体)关联起来。对java来说,绑定分为静态绑定和动态绑定;或者叫做前期绑定和后期绑定. 静态绑定: 在程序执行前方法已经被绑定...
  • zhangjk1993
  • zhangjk1993
  • 2014年04月19日 00:31
  • 19398
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态绑定的心得
举报原因:
原因补充:

(最多只允许输入30个字)