下图展示了三种 C++ 继承场景下,class C 的内存布局差异。

图中三类 C 的继承关系各不相同,对内存布局都有影响。class C 的大小依次为 16、20、24 字节。

多继承的问题

多继承会导致子类拥有多个虚表指针,从而使成员变量的排列偏移到 n*sizeof(void*) + XXXXX + XXXXX 字节之后。这带来了一系列潜在问题:

  • 重构时修改了继承体系,某处通过指针语法糖获取的字段就会出错。
  • DLL 导出时也会引发兼容性问题。

单继承的优势

单继承的好处在于:只要存在继承体系,成员变量的地址始终位于 sizeof(void*) 之后,问题因此简单得多。