我有这段代码:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};
int main(){
D* d;
A* a = d;
}
代码无法编译,我收到编译错误:
'A'是'D'
的模糊基础
我知道将继承虚拟化可以解决歧义问题。我的问题是,为什么upcast不能用于其中一个子对象?
答案 0 :(得分:4)
由于你有两个类型为A
的不同基础子对象,你需要说出你想要的那个:
A* a_b = static_cast<B*>(d);
A* a_c = static_cast<C*>(d);
答案 1 :(得分:0)
因为您正在处理多重继承,所以必须在类D
的一个超类之间进行转换,如下所示:
struct A {};
struct B : A {};
struct C : A {};
struct D : B, C {};
int main(){
D* d;
A* a = static_cast<B*>(d);
}
您也可以投射到C*
,但在这种情况下它没有什么重大区别,因为所有类都是空的。
答案 2 :(得分:-2)
这是因为编译器无法确定真正的基类(来自B或来自C)。
当您使用此层次结构时,您实际上正在使用类A的两个实例。一个实例包含在类B中,另一个实例包含在类C中。要使用单个实例,请使用虚拟基类< / strong>即可。 Virtual inheritance
struct A { };
struct B : virtual A { };
struct C : virtual A { };
struct D : B, C { };
int main(){
D* d;
A* a = d;
}