1

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

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

谢谢 :-)

4

1 回答 1

2

在多重继承的情况下,这是完全可以预料的。我们这里有一个钻石继承的例子。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 {...};

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

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

于 2012-04-10T17:55:32.847 回答