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; }
逻辑说明
- 虚继承的特性:由于B和C都使用
virtual public A继承,D实例中只会存在一个A子对象,满足“共享A子对象”的要求。 - 构造顺序:虚继承下,虚基类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
相关产品推荐
相关产品推荐

