如何从C++中两次继承的基类调用隐藏方法?
考虑D从两个类B和继承的类C,每个类都继承非虚拟类A。有一种方法f中A,并在相同的命名方法B隐藏与方法A。我想A::f()从对象的B-base 类调用D如下:
struct A { void f() {} };
struct B : A { void f() {} };
struct C : A {};
struct D : B, C {};
int main() { D{}.B::A::f(); }
不幸的是,它只适用于 MSVC,而 GCC 和 Clang 都会产生错误:
error: 'A' is an ambiguous base of 'D'
演示:https : //gcc.godbolt.org/z/jY3v876hK
它看起来像GCC /锵接受,但完全忽略B::的前缀B::A::f()。他们按照标准这样做是否正确?
回答
是的。在嵌套名指定A::,B::A或D::B::A全部用于同一目的,命名类A。
[basic.lookup.classref]
class-name-or-namespace-name::...在
class-name-or-namespace-name以下的.或->操作者首先在该对象的类别表达式([class.member.lookup])和名称的抬头,如果找到,则使用。否则,它将在整个后缀表达式的上下文中查找。
嵌套名称说明符不命名成员的“路径”,它命名为D. 并命名A导致歧义。