最近看《程序员面试宝典》,碰到虚函数的内存分布问题,顺便学习了内存对齐和虚拟继承的内存分布,将查到的资料按照自己的理解整理了一下,如若有误,请指正。

有关的资料:

http://blog.csdn.net/generalhking/article/details/7910072

http://blog.csdn.net/generalhking/article/details/8096222

http://blog.csdn.net/generalhking/article/details/7911595

http://wenku.baidu.com/view/70f9e26f7e21af45b307a8c3.html

http://www.cnblogs.com/BeyondAnyTime/archive/2012/06/05/2537451.html

(1)虚函数:基类与派生类共享基类的虚拟函数表

   虚拟继承:基类与派生类 对 相同的 虚拟函数 共享基类的虚拟函数表

             基类与派生类 对 不同的 虚拟函数 建立派生类自己的虚拟函数表

(2)内存布局顺序:

    普通继承基类 虚拟函数表指针

                 虚基类表指针

                 数据成员

    派生类       虚拟函数表指针

                 虚基类表指针

                 数据成员

    虚拟继承基类 虚拟函数表指针

                 虚基类表指针

                 数据成员

(3)类中的虚拟函数表指针和虚基类表指针的大小与类中最大的数据类型的大小有关,如果不大于系统的32位数,按照4byte算,如果大于4byte,按照最大的数据类型的大小算。

举例

class Base

{

public:

  virtual int f();

private:

  char a;

  double b;

};

sizeof(Base)的大小为24

(4)还有一中情况,原理我没搞懂,先列在这里,有知道的请不吝赐教

此例来自亚马逊面试题

class A

{

};

class B

{

};

class C

{

};

class D

{

};

class E:public virtual A,public virtual B,public virtual C,public virtual D

{

};

sizeof(E)大小是16