cls

动态绑定的实现机制

Posted on 2008-10-10 09:38 赏心悦目 阅读(55) 评论(0)  编辑  收藏

关于虚表、虚指针的具体实现方法,结合其他的人的观点,总结如下:

动态绑定的实现机制(三步)

1.在非虚继承中,为每一个包含虚函数的类设置一个虚表(VTABLE)每当创建一个包含有虚函数的类或从包含
   虚函数的类派生一个 类的对象时,编译器就会为这个类创建一个VTABLE。在VTABLE中,编译器放置了这个
   类(或者它的基类)中所有已经声明为 virtual的函数的地址。如果在这个派生类中没有对基类中声明为 virtual 的
   函数进行重新定义,编译器就使用基类的这个虚函数的地址。而且   所有VTABLE中虚函数地址的顺序是完全相
   同的;
  
   而在虚继承中,派生类对象中派生类的部分和基类的部分拥有各自的虚表,相应的派生类对象既需要有自己的
   虚指针又需要有基类部分的虚指针,同时为了实现虚继承,还需加入一个虚类指针指向父类对象,所以实现了
   虚继承的子类对象占用的空间应该为
   sizeof(父类) +   4指向父类的虚类指针)+  4派生类的虚指针,如果有的话) +   
   派生类自身成员变量占用空间(这里要考虑编译器的数据对齐,编译器一般以4的倍数对齐)

2.初始化虚指针(VPTR)
   然后编译器在这个类的各个对象中放置VPTR。VPTR在对象的相同的位置(通常都在对象的开头)。VPTR必
   须被初始化为指向相应的VTABLE。

3.为虚函数调用插入代码
   当通过基类的指针调用派生类的虚函数时,编译器将在调用处插入相应的代码,以实现通过VPTR找到VTABLE,
   并根据VTABLE中存储的正确的虚函数地址,访问到正确的函数。
 


只有注册用户登录后才能发表评论。
该文被作者在 2008-10-10 10:42 编辑过
网站导航: