"X is an ambiguous base of Y":多重继承噩梦

"X is an ambiguous base of Y": Multiple inheritance nightmare

下面是我的 class 层次结构。

所有 Ixxxx class 都是 接口 (没有成员数据的抽象 class )。

所有箭头代表继承。

颜色只是为了提供更好的视觉效果。

在使用这些 classes 的代码中的某处,我必须传递一个 Track*,其中需要一个 IConnectableTrack*,我得到以下编译错误:

error: ‘IConnectableTrack’ is an ambiguous base of ‘Track’

我知道这是多重继承的问题,但是我尝试了virtual继承的多重组合都无济于事。

特别是,我认为 虚拟化 红色接口之间的继承和绿色 classes(即所有紫色箭头)之间的继承就足够了,但确实如此没有解决问题。

这里的正确结构是什么?

编辑:这个问题与提到的问题不同,因为它包含纯抽象classes,这与引用的特定错误消息有关。

您的 Track 有四个 IConnectableTrack 实例,编译器不知道使用哪一个。将前 3 个箭头虚拟化。

https://wandbox.org/permlink/Y1e9LwDI0IVaERaW

class IConnectableTrack {};
class Object {};
class ConnectableTrack: public virtual IConnectableTrack, public Object {};
class IOccupiableTrack: public virtual IConnectableTrack {};
class OccupiableTrack: public IOccupiableTrack {};
class ISignalledTrack: public virtual IConnectableTrack {};
class SignalledTrack: public ISignalledTrack {};
class Track: public OccupiableTrack, public SignalledTrack {};

void f(IConnectableTrack&) {}

int main() {
    Track t;
    f(t);
}