【问题标题】:I have a variable b in parent class and when i try to access variable b from sum3 class it shows ambiguous b error我在父类中有一个变量 b,当我尝试从 sum3 类访问变量 b 时,它显示不明确的 b 错误
【发布时间】:2022-01-10 08:17:39
【问题描述】:

我在父类中有一个变量 b,当我尝试从 sum3 类访问变量 b 时,它显示了一个模棱两可的 b 错误。如果我从继承中删除总和,它将给出“clas.cpp|25|error: 'int sum::b' is inaccessible in this context|”错误怎么办?

#include<iostream>
using namespace std;

class sum
{

public:
int b=8;
};

class sum2:sum
{
public:
 int c=4;

};

class sum3:sum2,sum
{
 public:
int h=9;
 void add()
   { 
    int l;
    l=h+c+b;
    cout<<l;
   }
};

int main()
{
  sum3 c;
  c.add();
 }

【问题讨论】:

    标签: c++ inheritance diamond-problem


    【解决方案1】:

    这是因为你继承自 sum2sum 类,但 sum2 继承自 sum 所以它也继承了变量 b 所以当你打算使用sum3 类中的变量 b 编译器不知道你想要哪个变量,因为在 sum2 类中有一个变量在 sum 类中有一个同名 b

    解决方案之一是在 sum3 类中使用范围解析运算符,如下所示:

        class sum3:sum2,sum
    {
     public:
    int h=9;
     void add()
       { 
        int l;
        l=h+c+sum2::b;
        cout<<l;
       }
    };
    

    这通过告诉编译器我打算使用哪个变量来消除歧义,在这种情况下它是sum2 变量。

    请注意:

    这被称为菱形问题,它发生在多重继承的情况下,如果您想进一步阅读并了解如何避免它们,您可以使用此链接:How can I avoid the Diamond of Death when using multiple inheritance?

    【讨论】:

    • 是的,请点赞。这是一种完全合法的消除歧义的方法,我有点顽皮地把我的答案作为唯一的方法。
    • @Bathsheba 没问题,祝你有美好的一天!
    • 顺便说一句,Bathsheba 展示的是钻石,而您保留的是 Y 形。
    【解决方案2】:

    你需要写

    class sum2 : virtual sum
    

    class sum3 : sum2, virtual sum
    

    这样你在sum2sum3中只得到一个b,这样就消除了歧义。

    更多详情In C++, what is a virtual base class?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多