我当前的继承设计是否属于存在问题的钻石继承模式?
问题分析结论
你的设计无法正常运行,存在明显的逻辑漏洞,核心问题出在菱形继承的设计错误上。
现存漏洞
- 首先是基类重复实例问题:当前B采用普通继承方式继承A,C同时直接继承A、继承B,会导致C的实例中存在两份独立的A类子对象:一份是C直接继承来的,另一份是B继承来的。
- 直接触发虚函数调用二义性,编译器无法确定你调用
serialize/deserialize时指向的是哪份A子对象的虚表,编译阶段就会报错。 - 完全违背你“避免同一个基类出现不同表示”的需求,两份A子对象本身就是独立的两份基类存储,天然就会出现不同步的问题。
- 直接触发虚函数调用二义性,编译器无法确定你调用
- 其次是序列化逻辑不严谨:当前C的序列化函数只调用了B的序列化逻辑,完全没有处理直接继承的A类的相关序列化操作,后续如果A类新增需要序列化的成员,会直接出现数据遗漏。
修复方案
- 如果必须保留C同时继承A和B的结构,采用虚继承解决菱形继承问题:
修改继承声明为虚继承,保证整个继承树中仅存在一份A类子对象:class B : public virtual A { // 原有逻辑不变 }; class C : public virtual A, public B { // 原有逻辑不变 }; - 调整序列化调用顺序,遵循从基类到派生类的调用规则,C的序列化函数按A→B→C自身的顺序调用,反序列化可按相反顺序避免数据覆盖。
- 冗余继承优化:如果没有单独用A类指针指向C实例的特殊需求,完全可以删掉C对A的直接继承,仅保留
class C : public B即可,B已经继承了A的所有接口,C继承B就能自动获得序列化/反序列化能力,直接规避菱形继承问题,逻辑更简洁。
内容的提问来源于stack exchange,提问作者Trick
相关产品推荐
相关产品推荐

