虚拟派生和转换模棱两可

virtual derivation & conversion ambiguous

本文关键字:模棱两可 转换 派生 虚拟      更新时间:2023-10-16

我现在正在学习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
}

我不明白为什么我有这个错误,但是我没有其他影响的错误。

谢谢 :-)

在多重继承的情况下,这是完全意料之中的。我们这里有一个钻石继承的案例。D 现在有两个 A 副本,一个继承自 B,一个继承自 C。您需要指定暴露于 D 的 A 成员来自哪个 B 或 C。

请参阅:使用 C++,如何正确从同一基类继承两次?

您可以考虑:

  • 使用虚拟继承:

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

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

  • 使用组合作为摆脱多重继承的出路。

我建议阅读 用虚拟继承解决钻石问题