从基类的间接多重继承向上转型

upcast from indirect multiple inheritance of a base

我有这个代码:

struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};

int main(){
    D* d;
    A* a = d;
}

代码无法编译,出现编译错误:

'A' is an ambiguous base of 'D'

我知道使继承虚拟化将解决歧义。我的问题是,为什么向上转换对 A 的子对象之一不起作用?

因为您有两个不同的 A 类型的基础子对象,您需要说出您想要哪一个:

A* a_b = static_cast<B*>(d);
A* a_c = static_cast<C*>(d);

这是因为编译器无法确定真正的基础 class(来自 B 或来自 C)。

当您使用此层次结构时,您实际上使用了 class A 的两个实例。一个实例包含在 class B 中,另一个实例包含在 class C 中。使用单个实例,使用 虚拟基础 classVirtual inheritance

struct A { };
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };

int main(){

    D* d;
    A* a = d;
}

因为您正在处理多重继承,所以您必须在 class D 的超 class 之一之间进行转换,如下所示:

struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};

int main(){
    D* d;
    A* a = static_cast<B*>(d);
}

您也可以转换为 C*,但在这种情况下没有太大区别,因为所有 class 都是空的。