浅析C++中虚函数的调用及对象的内部布局

本文通过分析C++代码编译后的汇编代码,揭示虚函数调用的实现方式和对象的内部布局。举例展示了如何通过虚表指针找到虚函数,并解释了非虚成员函数与虚表的关系,证明了对象内部前四个字节通常用于存储虚表指针。
摘要由CSDN通过智能技术生成

     在我那篇《浅析C++中的this指针》中,我通过分析C++代码编译后生成的汇编代码来分析this指针的实现方法。这次我依然用分析C++代码编译后生成的汇编代码来说明C++中虚函数调用的实现方法,顺便也说明一下C++中的对象内部布局。下面所有的汇编代码都是用VC2005编译出来的。虽然,不同的编译器可能会编译出不同的结果,对象的内部布局也不尽相同;但是,只要是符合C++标准的编译器,编译结果和对象的内部布局应该是大同小异。
    首先,是一个有着简单继承关系的两个类:

class  CBase
{
public :
    
virtual   void  VFun1()  =   0 ;
    
virtual   void  VFun2()  =   0 ;
    
void  Fun1();
};

//  这里仅仅是为了生成函数的汇编代码,因此函数体为空
void  CBase::Fun1()
{
}

class  CDerived :  public  CBase
{
public :
    
virtual   void  VFun1();
    
virtual   void  VFun2();
    
void  Fun2();
private :
    
int  m_iValue1;
    
int  m_iValue2;
};

//  这里仅仅是为了生成函数的汇编代码,因此函数体为空
void  CDerived::VFun1()
{
}

//  这里仅仅是为了生成函数的汇编代码,因此函数体为空
void  CDerived::VFun2()
{
}

//  这里是为了分析对象的内部布局,因此仅仅是给成员变量赋值
void  CDerived::Fun2()
{
    m_iValue1 
=   13 ;
    m_iValue2 
  • 5
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 21
    评论
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值