分享

对象内存布局

 astrotycoon 2015-10-25

 

内容概要:

 

满足下面2个条件时,

1. 父类有虚函数,子类无虚函数(即无虚函数重写或无虚函数覆盖)

2. 非虚继承

子类对象之内存布局

 

前述相关内容参考:

1. http://blog.sina.com.cn/s/blog_5f5fff010100cv8j.html

2. http://blog.sina.com.cn/s/blog_5f5fff010100cv90.html~type=v5_one&label=rela_nextarticle

3. http://blog.sina.com.cn/s/blog_5f5fff010100cvd6.html~type=v5_one&label=rela_nextarticle

 

Base类中有两个虚函数vfBase_1()、vfBase_2()和一个整形成员变量m_base, Derived类中有一个整形成员变量m_derived,二者的关系如下:

对象内存布局 <wbr>(1) 

代码如下:

#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;

}

运行结果如下:

 

对象内存布局 <wbr>(1) 

Derived对象的memory layout图解如下:

对象内存布局 <wbr>(1)

 

后篇:http://blog.sina.com.cn/s/blog_5f5fff010100cw5v.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多