在我那篇《浅析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
{
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