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

C++虚继承场景下如何从特定派生类获取指定成员值?

问题分析与解决

为什么输出不是2?

你用了虚继承(virtual public A),这会让整个继承体系中只存在一个A类的实例——B、C、D所有对a的访问,本质都是操作同一个变量。

构造顺序遵循C++虚继承的规则:

  1. 先构造虚基类A,a被初始化为1;
  2. 构造B,把这个唯一的a改成2;
  3. 构造C,再把这个a改成3;
  4. 构造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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 05:30:43