(1)菱形继承
导致了二义性问题,有几种方式解决
一种是限制继承深度,让菱形继承无法出现
一种是使用虚拟继承,但虚拟继承本身带来以下问题(细节见Effective C++ Item 40)
虚基类初始顺序较复杂
由最终派生类呼叫虚基类ctor,容易踩坑
占比较多的空间,且影响data存取速度
(2)指标偏移
父类指标与子类指标指向同一实体,但位址未必相同
不过指标拿来做比较运算时相同,因为会隐式转型成父类指标再比较
(3)转型导致虚函数执行结果无法预期
第一种情况是涉及void*,导致转型时指标不偏移
第二种情况是使用不偏移指标的转型:reinterpret_cast
(4)More Effecitve C++ Item M24
影响效能且占比较多的空间
(5)Google C++ Style Guide
多重继承本身带来的效能影响比虚拟继承还高
避免多重实作继承
(6)Effective C++ Item 40
public接口继承 + private实作继承
(7)C++ Core Guidelines C.135
用多重继承表示多个不同的接口,这些接口通常是抽象类
(8)C++ Core Guidelines C.136
用多重继承表示实现特性的合并;此item认为优先使用单一继承
(9)Modern C++ Design
第一章的policy based design,结合多重继承跟template
第三章的hierarchy generator,现在可以用variadic template简化
(10)C++ Templates: The Complete Guide 21.3
mixin,能在不复制接口的情况下增加data成员或其他操作
为了增加任意数量的base,会用到variadic template
补充:
mixin跟policy based design都是多重实现继承
前者与派生类有"-ABLE"的关系
后者强调在相同接口下选择何种行为,而不是增加data成员或其他操作
前者应采用public继承,后者应采用private继承