注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

逍遥子 曰:

得失失得 何必患得患失 舍得得舍 不妨不舍不得

 
 
 

日志

 
 

C++虚函数表的总结[原]  

2013-03-13 10:41:51|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
                     
1、 C++的多态主要是通过虚函数表来实现的:
(1)编译器为每个虚基类生成一个虚函数表,但是类中只包含该虚函数表的首地址;
(2)每个继承自需基类的子类都继承了虚基类的虚函数表。
(3)虚函数表实际上就是一个内存块,在编译时属于代码段的一部分,该类的所有对象均共享虚函数表。
       例如有如下基类
struct IX
{
virtual void _stdcall Fx1() = 0;
virtual void _stdcall Fx2() = 0;
virtual void _stdcall Fx3() = 0;
virtual void _stdcall Fx4() = 0;
};
则其编译之后如图1所示:
C++虚函数表的总结[原] - 逍遥子 - 逍遥子 曰:
  图1、虚函数表
此时如果有一个类CA实现了该接口,例如:
class CA:public IX
{
public:
virtual void _stdcall Fx1() {cout<<"CA::Fx1"<<endl;}
virtual void _stdcall Fx2() {cout<<"CA::Fx2"<<endl;}
virtual void _stdcall Fx3() {cout<<"CA::Fx3"<<endl;}
virtual void _stdcall Fx4() {cout<<"CA::Fx4"<<endl;}
CA(double d):m_x1(d),m_x2(d*d),m_x3(d*d*d){}
private:
double m_X1;
double m_X2;
double m_X3;
};
则类CA的虚函数表就继承了接口IX的虚函数表,但是接口虚函数表中为空的各虚函数,都被实现类CA的实际实现函数所填充,如图2所示:
C++虚函数表的总结[原] - 逍遥子 - 逍遥子 曰:
  图2
2、C++的多重继承
在C++的多种继承时,如果将派生类的指针转换为其某个继承的子类时可能需要修改指针的位置,例如:
class CA:public IX,public IY {...};
由于CA同时继承了IX和IY,因此将CA对象的地址传递给IX或IY类型的指针都是可以的。如图3所示
C++虚函数表的总结[原] - 逍遥子 - 逍遥子 曰:
  图3
如图3所示,当把CA的this指针指向IX的虚函数表,因此可以在不转换CA的this指针的情况用它来代替IX指针;但是类CA的this指针并未指向IY的虚函数表的首地址,因此在将类CA的指针传给一个接受IY指针的变量前需要对CA的this指针进行修改,因此编译器在遇到:
CA* pA = new CA;
IY* pC = pA;
时对“IY* = pA”做了类似于下面的动作:

IY* pC = (char*)pA + delt IY;


  评论这张
 
阅读(360)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018