无法摆脱 C++ 中的 Diamond 问题

Unable to get rid of Diamond issue in C++

Please have a look at the code:
#include <iostream>
using namespace std;

 class base1
 {
 public:
    int x,y;
 };
  class base2
 {
 public:
    int x, z;
 };

 class derived: virtual public  base1,virtual public  base2
 {
    public:
     void display(int a, int b, int c)
     {
        x=a;
        y=b;
        z=c;
        cout<<x<<endl<<y<<endl<<z<,endl;

     }
 };

 int main()
 {
    derived dr;
    dr.display(1,2,3);
 }

由于基类 base1 和base2 是虚拟的,所以应该解决这些类 中x 的声明问题。但是,事实并非如此。它给我一个错误: 错误:对“x”的引用不明确 谁能放灯?

不要引用模糊的 xyz 变量,而是使用 base1.xbase2.x。例如:

更改

    x=a;
    y=b;
    z=c;
    cout<<x<<endl<<y<<endl<<z<<endl;

    base1 b1;
    base2 b2;
    b1.x=a;
    b2.x=a;
    b1.y=b;
    b2.z=c;
    cout<<b2.x<<endl<<b1.y<<endl<<b2.z<,endl;

或:(如果您想更改 this 值)

    base1::x=a;
    base2::x=a;
    base1::y=b;
    base2::z=c;
    cout<<base2::x<<endl<<base1::y<<endl<<base2::z<,endl;

这不是钻石继承问题。你有:

base1  base2
 ^      ^
 |      |
 \      /
  \    /
   \  /
    \/
 derived

问题是 base1base2 都有成员 x.

即使您没有钻石继承,您也需要使用 base1::base2:: 来消除 xderived 的歧义。

暂时忽略derived::display中改变成员变量值的原理,可以使用:

class derived: virtual public  base1,virtual public  base2
{
   public:
      void display(int a, int b, int c)
      {
         base1::x=a;
         y=b;
         z=c;
         cout<<base1::x<<endl<<y<<endl<<z<<endl;
      }
};