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

When using multiple inheritance, why is this qualified name ambiguous?

本文关键字:定名称 不明确 为什么 多重继承      更新时间:2023-10-16

我正试图使用Bottom对象访问结构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: %dn", 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: %dn", b.Left::Top::x);
                                        ^

这是如何模棱两可的?我如何使用限定名称访问它?

问题是C++没有办法直接表达"多级"类成员的概念,例如"LeftTop子对象的成员x"。Left::Top::x的意思是"Left::Top表示的类型中的成员x",而Left::Top表示的类型正是Top

这就是为什么你可以写一些奇怪的东西,比如

int Left::* ptr = &Right::Top::x;

因为=的右手边正好等价于&Top::x,并且指向基类成员的指针可以隐式转换为指向派生类成员的指针。(此转换的结果仍然引用派生类的基类子对象中的成员。)

为了消除歧义,您可以沿着static_cast<Left &>(b).Top::x的行做一些事情,或者使用指向成员的指针——给定int Left::* ptr = &Top::x;b.*ptr将引用bLeft子对象的Top子对象中的x