内容概要:
满足下面2个条件时,
1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖)
2. 非虚继承
类对象之内存布局
前述相关内容参考:
1. http://blog.csdn.net/pathuang68/archive/2009/04/20/4096088.aspx
2. http://blog.csdn.net/pathuang68/archive/2009/04/21/4096429.aspx
3. http://blog.csdn.net/pathuang68/archive/2009/04/21/4096521.aspx
Base类中有两个虚函数vfBase_1()、vfBase_2()和一个整形成员变量m_base, Derived类中有一个整形成员变量m_derived,二者的关系如下:
代码如下:
#include <iostream>
using namespace std;
class Base
{
public:
int m_base;
inline virtual void vfBase_1()
{
cout << "This is in Base::vfBase_1()" << endl;
}
inline virtual void vfBase_2()
{
cout << "This is in Base::vfBase_2()" << endl;
}
};
class Derived : public Base
{
public:
int m_derived;
};
typedef void (*VFun)(void);
// 改为template形式,因为不能确定传进来的参数是Base类型的指针还是Derived类型的指针
template<typename T>
VFun virtualFunctionPointer(T* b, int i)
{
return (VFun)(*((int*)(*(int*)b) + i));
}
int main(void)
{
Derived d;
cout << "The size of Base object = /t" << sizeof(Derived) << endl;
cout << endl;
int i = 0;
while(virtualFunctionPointer(&d, i))
{
VFun pVF = virtualFunctionPointer(&d, i++);
pVF();
}
return 0;
}
运行结果如下:
Derived对象的memory layout图解如下:
后篇:http://blog.csdn.net/pathuang68/archive/2009/04/23/4101977.aspx