继承 虚继承 结构体 替内存布局抛砖引玉

继承 虚继承 结构体 为内存布局抛砖引玉

看了太多人问的  “定义体为空的类的大小是多少?以及不同的继承类型的基类以及虚继承得到的类的大小”,云云之类的。太多这些问题了,今天笔者希望用最简单易懂的语言以及最清晰的图解告诉大家,这其实并不高深。

注:下面的struct换成class依旧成立。


问题 1:空类的大小是多少?

例如: struct A { };    //  答案是1 , 一个显而易见的道理,如果利用该类型定义两个对象,即

A  a, b; 那么a和b的地址总该有吧,并且两者地址应该不一样吧,因此编译器为其分配一个字节的大小。


问题1  解决!


问题2:如果一个类继承自某一个空类,那么这个继承类的大小是多少?

取决于继承的方式是否为虚继承,

1  不是虚继承

例如:

struct A{   };

struct B : public A {  }; //B的大小为1,依旧是1,只是定义了一个类B,B仍然是空,同理大小仍然是1. 


2   虚继承 

例如:

struct A {  };

struct B : virtual public A {  } ; //B的大小为4 或者8(在笔者的编译器环境下为4).

继承 虚继承 结构体 替内存布局抛砖引玉大小为8的情况!

继承 虚继承 结构体 替内存布局抛砖引玉大小为4的情况!·




拓展:如果是多层继承呢,显然,以此类推,得到的结果依然是4。

如果是多重继承呢??例如下面的代码:

class A {  };
class B {   };
class C : virtual public A, virtual public B {  }; // C的大小为4,按理说,它应该有两个指针指向它的两个父类,实际上有些编译器是这样,但在微软的编译器上有如下示意图:

继承 虚继承 结构体 替内存布局抛砖引玉

C中有一个指针指向一个 虚基类表,这里存放的是就是那两个指向直接基类的指针。



本文旨在抛砖引玉,可参见如下转载的译文: