我正在尝试使用 Bottom 对象访问struct Top 中的成员变量 x 。
代码如下:
#include <cstdio>
struct Top
{
public:
int x = 1;
};
struct Left : public Top
{
int x = 2;
};
struct Right : public Top
{
int x = 3;
};
struct Bottom : public Left, public Right
{
int x = 4;
};
int main()
{
Bottom b;
std::printf("value: %d\n", b.Left::Top::x);
return 0;
}
使用gcc 4.8:
会出现以下错误main.cpp: In function 'int main()':
main.cpp:27:45: error: 'Top' is an ambiguous base of 'Bottom'
std::printf("value: %d\n", b.Left::Top::x);
^
这有多么模糊,如何使用限定名称访问它?
答案 0 :(得分:4)
问题在于C ++没有办法直接表达&#34;多层次&#34;类成员,例如&{34; x
Top
&#34;的Left
子对象的成员Left::Top::x
。 x
的含义是&#34;由Left::Top
&#34;表示的类型中的成员Left::Top
- Top
表示的类型正好是int Left::* ptr = &Right::Top::x;
。
这就是为什么你可以写出奇怪的东西,比如
=
因为&Top::x
的右侧与static_cast<Left &>(b).Top::x
完全等价,并且指向基类的成员可以隐式转换为指向派生类的成员。 (此转换的结果仍然是指派生类的基类子对象中的成员。)
要消除歧义,您可以执行int Left::* ptr = &Top::x;
或使用指向成员的指针 - b.*ptr
,x
会引用Top
在Left
b
子对象的{{1}}子对象中。