ano*_*der 8 c++ inheritance multiple-inheritance
我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)
这使用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);
^
Run Code Online (Sandbox Code Playgroud)
这是多么模糊,如何使用合格的名称访问它?
问题是C++没有办法直接表达“多级”类成员的概念,比如“x的Top子对象的成员Left”。什么Left::Top::x意思是“成员x中记类型Left::Top” -和记类型Left::Top正好Top。
这就是为什么你可以写一些奇怪的东西,比如
int Left::* ptr = &Right::Top::x;
Run Code Online (Sandbox Code Playgroud)
因为 的右侧=完全等效于&Top::x,并且指向基类成员的指针可以隐式转换为指向派生类成员的指针。(此转换的结果仍然引用派生类的基类子对象中的成员。)
要消除歧义,您可以按照static_cast<Left &>(b).Top::x或使用指向成员的指针执行某些操作-给定int Left::* ptr = &Top::x;,b.*ptr将引用x的Top子对象的Left子对象中的b。