You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何让多重继承的两个父类共用同一基类属性且不修改原有类?

可行实现方案

你遇到的是C++多继承场景下的菱形继承问题,默认多继承模式下两个父类会各自携带一份Base类实例,因此会存在两个独立的a成员。在不修改三个上层类的前提下,你可以通过在Combined类中隐藏父类的add、sub方法,自定义实现让两个方法操作同一个值并同步两份a的数值即可达到要求。

实现代码

#include <iostream>

class Base {
public:
    int a;

    Base() : a(0) {};
};

class Inherited1 : public Base {
public:
    void add() {
        a++;
    }
};

class Inherited2 : public Base {
public:
    void sub() {
        a--;
    }
};

class Combined : public Inherited1, public Inherited2 {
public:
    // 隐藏父类的add、sub方法,自定义实现
    void add() {
        // 统一操作Inherited1携带的Base实例的a,同步更新Inherited2的a
        Inherited1::add();
        Inherited2::a = Inherited1::a;
    }
    void sub() {
        // 统一操作同一个a,同步更新两份实例的数值
        Inherited1::a--;
        Inherited2::a = Inherited1::a;
    }
};

int main() {
    Combined obj;

    obj.add();
    obj.add();
    obj.sub();

    std::cout << dynamic_cast<Inherited1*>(&obj)->a << ' ';     // 输出1
    std::cout << dynamic_cast<Inherited2*>(&obj)->a;            // 输出1

    return 0;
}

补充说明

你仿写std::iostream遇到这个问题是很合理的,标准库的iostream本身继承自istream和ostream,而这两个类都虚继承自ios基类,天然就只会保留一份基类实例,不存在你遇到的重复成员问题。如果后续你可以调整上层类的定义,只需要把Inherited1和Inherited2的继承方式改为virtual public Base就可以从根源解决这个问题,不需要在子类额外同步数值。

内容的提问来源于stack exchange,提问作者fpekal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:57:03