无法摆脱 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”的引用不明确
谁能放灯?
不要引用模糊的 x
、y
和 z
变量,而是使用 base1.x
或 base2.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
问题是 base1
和 base2
都有成员 x
.
即使您没有钻石继承,您也需要使用 base1::
或 base2::
来消除 x
与 derived
的歧义。
暂时忽略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;
}
};
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”的引用不明确 谁能放灯?
不要引用模糊的 x
、y
和 z
变量,而是使用 base1.x
或 base2.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
问题是 base1
和 base2
都有成员 x
.
即使您没有钻石继承,您也需要使用 base1::
或 base2::
来消除 x
与 derived
的歧义。
暂时忽略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;
}
};