对象内存布局 (1)

来源:互联网 发布:网络卖竹鼠什么意思 编辑:程序博客网 时间:2024/06/03 14:45

内容概要:

满足下面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图解如下:

 

原创粉丝点击