从基数的间接多重继承向上转换

时间:2016-09-06 19:02:09

标签: c++ oop multiple-inheritance

我有这段代码:

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

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

代码无法编译,我收到编译错误:

  

'A'是'D'

的模糊基础

我知道将继承虚拟化可以解决歧义问题。我的问题是,为什么upcast不能用于其中一个子对象?

3 个答案:

答案 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;
}