使用多重继承时,为什么这个限定名称不明确?

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)

这是多么模糊,如何使用合格的名称访问它?

T.C*_*.C. 5

问题是C++没有办法直接表达“多级”类成员的概念,比如“xTop子对象的成员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将引用xTop子对象的Left子对象中的b