如何从C++中两次继承的基类调用隐藏方法?

考虑D从两个类B和继承的类C,每个类都继承非虚拟类A。有一种方法fA,并在相同的命名方法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::AD::B::A全部用于同一目的,命名类A

[basic.lookup.classref]

class-name-or-namespace-name::...

class-name-or-namespace-name以下的.->操作者首先在该对象的类别表达式([class.member.lookup])和名称的抬头,如果找到,则使用。否则,它将在整个后缀表达式的上下文中查找。

嵌套名称说明符不命名成员的“路径”,它命名为D. 并命名A导致歧义。


以上是如何从C++中两次继承的基类调用隐藏方法?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>