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

C++多虚继承下,如何从不同基类分别继承成员x和y?

解决方案

你的核心问题在于:B和C的构造函数同时修改了共享A实例的x和y,导致后续构造函数的修改覆盖了之前的结果。要实现“从B继承x、从C继承y且共享A子对象”的需求,只需调整B、C的构造逻辑,让它们各自只修改目标成员即可。

修改后的代码

#include <iostream>

class A {
protected:
    int x;
    int y;
public:
    A() : x(10), y(10) {}
};

class B : virtual public A {
public:
    B() { this->x = 20; } // 仅修改x,保留y的初始值或其他类的修改
};

class C : virtual public A {
public:
    C() { this->y = 30; } // 仅修改y,保留x的初始值或其他类的修改
};

class D : public B, public C {
public:
    D() {
        // 无需额外赋值,直接使用共享A实例中的x和y
        std::cout << "x = " << this->x << std::endl;
        std::cout << "y = " << this->y << std::endl;
    }
};

int main() {
    D obj;
    return 0;
}

逻辑说明

  1. 虚继承的特性:由于B和C都使用virtual public A继承,D实例中只会存在一个A子对象,满足“共享A子对象”的要求。
  2. 构造顺序:虚继承下,虚基类A的构造由最派生类D负责,构造顺序为:A() -> B() -> C() -> D()。
    • A初始化x=10、y=10;
    • B构造时仅将x改为20,不影响y;
    • C构造时仅将y改为30,不影响x;
    • D构造时直接输出共享A实例中的x=20、y=30,正好符合“从B取x、从C取y”的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:11:20