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

时间:2014-09-20 19:46:46

标签: 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;
}

使用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);
                                        ^

这有多么模糊,如何使用限定名称访问它?

1 个答案:

答案 0 :(得分:4)

问题在于C ++没有办法直接表达&#34;多层次&#34;类成员,例如&{34; x Top&#34;的Left子对象的成员Left::Top::xx的含义是&#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.*ptrx会引用TopLeft b子对象的{{1}}子对象中。