虚拟继承和函数成员

时间:2017-08-29 18:22:34

标签: c++ member-functions virtual-inheritance

让我们考虑以下代码片段:

struct A { void f(); };
struct B : virtual A {};
struct C : virtual A {};
struct D : B, C {};

我能说什么? D有两个不同的成员函数B::A::fC::B::f是否在同一个对象上调用?或者它们只是同一成员函数的别名?

例如,对于非虚拟案例,

struct A { void f(); };
struct B : A {};
struct C : A {};
struct D : B, C {};

D有两个不同的成员函数B::A::fC::A::f,因为它们只有不同的名称,因此,调用D().f()是一个ambigüity,因为我必须指定哪个成员我想打电话。

然而,在虚拟的inhericante情况下,这不再需要了,因为通过一个或另一个路径调用解析为在同一个对象上调用该函数,而且我不知道在虚拟继承的情况下,我是否有两个不同的成员函数可以解析或在同一个对象上执行,或者它们只是同一个成员函数的别名。

无论如何,从实际的角度来看,差异并不重要,但从更正式的角度来看,我不确定该说些什么。

1 个答案:

答案 0 :(得分:2)

在虚拟继承的情况下,您有D::A::f()并且在两个中间继承级别中没有特定的重写版本。

D().B::A::f()的工作原理与它在这种简单的情况下工作的原因相同(它继承了父版本):

struct A { void f(); };
struct B : A {};
struct D : B {};