虚拟推导&转换含糊不清

时间:2012-04-10 17:52:36

标签: c++ virtual

我现在正在学习C ++虚拟派生中不同的歧义情况。 但是我的代码中存在歧义错误,我不理解它的原因......

  

这是我的代码:

class V {
    public:
        int v ;
};

class A {
    public:
        int a ;
};

class B : public A, public virtual V {

};

class C : public A, public virtual V {

};

class D : public B, public C {
    public:
        void f() ;
};

void g() {
    D d ;
    B* pb = &d ;  // No Problem
    A* pa = &d ;  // Error: 'A' is ambiguous base of 'D'
    V* pv = &d ;  // No Problem
}

我不明白为什么会出现这个错误,但我没有其他做法的错误。

谢谢: - )

1 个答案:

答案 0 :(得分:2)

multiple inheritance的情况完全可以预料到这一点。我们这里有一个钻石继承案例。 D现在有两个A副本,一个从B继承,一个从C继承。你需要指定暴露给D的A成员来自B或C中的哪一个。

请参阅:Using C++, how do I correctly inherit from the same base class twice?

您可以考虑:

  • 使用虚拟继承:

    class B : public virtual A, public virtual V {...};

    class C : public virtual A, public virtual V {...};

  • 使用合成作为多重继承的一种方式。

我建议阅读Solving the Diamond Problem with Virtual Inheritance