让我们考虑以下代码片段:
struct A { void f(); };
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};
我能说什么? D
有两个不同的成员函数B::A::f
和C::B::f
是否在同一个对象上调用?或者它们只是同一成员函数的别名?
例如,对于非虚拟案例,
struct A { void f(); };
struct B : A {};
struct C : A {};
struct D : B, C {};
D
有两个不同的成员函数B::A::f
和C::A::f
,因为它们只有不同的名称,因此,调用D().f()
是一个ambigüity,因为我必须指定哪个成员我想打电话。
然而,在虚拟的inhericante情况下,这不再需要了,因为通过一个或另一个路径调用解析为在同一个对象上调用该函数,而且我不知道在虚拟继承的情况下,我是否有两个不同的成员函数可以解析或在同一个对象上执行,或者它们只是同一个成员函数的别名。
无论如何,从实际的角度来看,差异并不重要,但从更正式的角度来看,我不确定该说些什么。
答案 0 :(得分:2)
在虚拟继承的情况下,您有D::A::f()
并且在两个中间继承级别中没有特定的重写版本。
D().B::A::f()
的工作原理与它在这种简单的情况下工作的原因相同(它继承了父版本):
struct A { void f(); };
struct B : A {};
struct D : B {};