链式继承与多继承在条件删除特殊成员函数中的优劣对比
在C++20引入requires约束之前,要基于模板参数T的特性,条件控制模板类template <class T> struct X;的特殊成员函数(SMF)的默认/删除,链式继承相比多继承有这些关键优势:
避免歧义与名称冲突
每个链式基类只负责一类SMF的行为控制,继承层级是线性的,不会出现多继承下多个基类可能存在同名辅助成员(比如用于特性检测的嵌套类型、静态常量)导致的访问歧义。要是用多继承,碰到这种情况就得显式限定基类名,平白增加代码复杂度。逻辑层级与依赖关系更直观
链式继承可以按SMF的优先级或依赖关系组织层级——比如移动构造/赋值通常依赖拷贝构造/赋值的存在性,这种依赖能直接通过继承顺序体现出来,逻辑一目了然。而多继承的基类都是平级的,没法直观表达这种依赖,读代码时得逐个梳理每个基类的作用,效率低。模板特化与组合更灵活
链式继承的每个基类可以接受前一个基类作为模板参数,逐步叠加SMF的控制逻辑。比如Base1<T>管拷贝构造,Base2<T, Base1<T>>在它基础上管移动构造,新增或修改某类SMF的控制逻辑时,只需要调整对应的链式节点,不会影响其他基类。多继承模式下每个基类都是独立的,组合逻辑时得同时管理多个基类的特化,耦合度高,改起来麻烦。避免支配规则引发的意外行为
多继承里如果两个基类有同名成员函数(哪怕是私有辅助函数),编译器可能会因为支配规则(dominance rule)导致重载解析结果不符合预期。链式继承是单继承链,成员查找是线性的,不会出现这种问题,行为更可控。
内容的提问来源于stack exchange,提问作者Brian Bi

