多继承
C++还支持多继承特性,一个类型可以继承于多个基类(假设基类分别为B1, B2, …, Bn),其中每个基类都可能有成员数据及虚函数表,继承类I也必须能够无缝的向下转形为任一基类,其内存布局的一般规则如下...接着放置B2的数据成员,并逐个执行内存对齐
e. 对接下来的基类Bi重复c和d两个步骤,直到 Bn
f. 接着放置I自身的数据成员,并逐个执行内存对齐
g....:
image.png
而GCC采用了不同的方法来实现虚拟继承机制,之前提到VC会为虚拟继承类型生成虚基类表,并在实例中插入虚基类表指针,GCC同样也会为虚拟继承类型生成虚基类表,但是GCC并不会在实例中插入虚基类表指针...,相反,GCC”合并”了虚函数表指针(vptr)和虚基类表指针(vbptr),
或者说GCC只使用了vptr来实现虚函数的重载和虚基类的索引,方法是通过正向索引vptr来定位虚函数(vptr + offset...),通过负向索引vptr来定位虚基类(vptr - offset),所以在内存布局上会比VC生成的内存布局小一些,这里我们同样来计算一下GCC为上面的类型I生成的内存布局大小:
首先对齐各个成员:
sizeof