从基类的间接多重继承向上转型
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 中。使用单个实例,使用 虚拟基础 class。 Virtual 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 都是空的。
我有这个代码:
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 中。使用单个实例,使用 虚拟基础 class。 Virtual 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 都是空的。