" X是Y"模糊的基础:多重继承的噩梦

时间:2017-10-02 22:37:41

标签: c++ inheritance multiple-inheritance virtual-inheritance

以下是我的类层次结构。

所有Ixxxx类都是 interfaces (没有成员数据的抽象类)。

所有箭头代表继承。

颜色仅用于提供更好的可视化效果。

class hierarchy

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

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

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

特别是,我认为虚拟化红色接口之间的遗传和绿色类之间的遗传(即所有紫色箭头)都足够了,但它无法解决问题。

这里的正确构造是什么?

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

1 个答案:

答案 0 :(得分:3)

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

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);
}