C++虚继承场景下如何从特定派生类获取指定成员值?
问题分析与解决
为什么输出不是2?
你用了虚继承(virtual public A),这会让整个继承体系中只存在一个A类的实例——B、C、D所有对a的访问,本质都是操作同一个变量。
构造顺序遵循C++虚继承的规则:
- 先构造虚基类A,
a被初始化为1; - 构造B,把这个唯一的
a改成2; - 构造C,再把这个
a改成3; - 构造D时,
B::a指向的还是那个唯一的a(此时值为3),所以赋值后a仍然是3。
最终输出自然是3,而非你期望的2。
如何获取B类的独立成员值?
根据你的需求,有两种可行方案:
方案1:去掉虚继承
如果不需要解决菱形继承的重复基类问题,直接移除B和C继承A时的virtual关键字,这样B和C会各自拥有独立的A实例,它们的a是两个不同的变量。此时在D中可以通过作用域限定符访问各自的a:
#include <iostream> class A { public: int a; A() : a(1){} }; class B : public A { public: B() {this->a = 2;} }; class C : public A { public: C() {this->a = 3;} }; class D : public B, public C { public: D() {} }; int main() { D test; std::cout << test.B::a << std::endl; // 输出2 std::cout << test.C::a << std::endl; // 输出3 }
方案2:保留虚继承,给B/C添加独立成员
如果必须保留虚继承(比如要处理菱形继承的其他逻辑),可以让B和C各自定义专属的成员变量,不再共用A的a:
#include <iostream> class A { public: int a; A() : a(1){} }; class B : virtual public A { public: int b_a; // B专属的成员变量 B() : b_a(2) {} }; class C : virtual public A { public: int c_a; // C专属的成员变量 C() : c_a(3) {} }; class D : public B, public C { public: D() {} }; int main() { D test; std::cout << test.b_a << std::endl; // 输出2 std::cout << test.c_a << std::endl; // 输出3 }
内容的提问来源于stack exchange,提问作者Tiemen B
相关产品推荐
相关产品推荐

