继承 虚继承 结构体 替内存布局抛砖引玉
继承 虚继承 结构体 为内存布局抛砖引玉
看了太多人问的 “定义体为空的类的大小是多少?以及不同的继承类型的基类以及虚继承得到的类的大小”,云云之类的。太多这些问题了,今天笔者希望用最简单易懂的语言以及最清晰的图解告诉大家,这其实并不高深。
注:下面的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中有一个指针指向一个 虚基类表,这里存放的是就是那两个指向直接基类的指针。
本文旨在抛砖引玉,可参见如下转载的译文: