我有这段代码(钻石问题):
#include <iostream>
using namespace std;
struct Top
{
void print() { cout << "Top::print()" << endl; }
};
struct Right : Top
{
void print() { cout << "Right::print()" << endl; }
};
struct Left : Top
{
void print() { cout << "Left::print()" << endl; }
};
struct Bottom: Right, Left{};
int main()
{
Bottom b;
b.Right::Top::print();
}
我想在Top
类中调用print()
。
当我尝试编译时,我得到了错误:'Top'是'Bottom'的模棱两可的基类
,出现在这一行:b.Right::Top::print();
为什么会有歧义?我明确指定了我想要来自Right
而不是Left
的Top
。
我不想知道如何完成它,是的,可以使用引用、虚继承等方法。我只想知道为什么b.Right::Top::print();
存在歧义。
A
,但D*
无法隐式转换为A*
。 - Johannes Schaub - litbB::A::tell
告诉它你想调用哪个函数。你通过使用D::tell
来帮助编译器,即名称查找。但你不指定它必须使用的子对象 - 它将有两个选择:沿着B
上的A
或沿着C
上的路走,并给出错误提示。 - Johannes Schaub - litbd.tell()
,如果您删除除A
的tell函数之外的所有tell函数,则命名类将为D
,但是tell
将是A
的直接成员,而A
是模糊的。如果您然后说D.B::A::tell()
,则根据5.2.5p5,它是良好形式的,但根据11.2p6,它是不良形式的。这些检查相互补充,在类型系统中正常运行非常重要。 - Johannes Schaub - litb