首先我想承认有 many questions with similar titles和主题。我相当确定我的产品在他们中是独一无二的。
给定代码
struct Top {
int get() {
return 0;
}
};
struct Mid1 : Top {
int get() {
return 1;
}
};
struct Mid2 : Top {
int get() {
return 2;
}
};
struct Bottom : Mid1, Mid2 {
};
int main(int argc, char ** argv) {
Bottom b;
std::cout << b.Mid1::get();
std::cout << b.Mid2::get()
std::cout << b.Top::get();
}
我在尝试访问 Top::get()
时遇到错误(使用 gcc mingw-w64)
error: 'Top' is an ambiguous base of 'Bottom'
std::cout << b.Top::get();
我收到一个错误。在这种情况下,如何向编译器发出信号以在特定继承路径上调用 Top::get
?
最佳答案
底部
是derived class没有使用 virtual inheritance ,因此它有 2 个不同的 Top
实例 - 一个继承自 Mid1
,另一个继承自 Mid2
。因此,您必须明确告诉编译器您要从哪个 Top
实例调用 get()
,例如:
std::cout << b.Mid1::get(); // OK
std::cout << b.Mid2::get(); // OK
std::cout << b.Top::get(); // ERROR!
std::cout << b.Mid1::Top::get(); // ERROR!
std::cout << b.Mid2::Top::get(); // ERROR!
std::cout << static_cast<Mid1&>(b).Top::get(); // OK
std::cout << static_cast<Mid2&>(b).Top::get(); // OK
关于c++ - 消除c++中菱形继承(钻石问题)访问顶级成员的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993468/