以下是我的类层次结构。
所有Ixxxx
类都是 interfaces (没有成员数据的抽象类)。
所有箭头代表继承。
颜色仅用于提供更好的可视化效果。
使用这些类的代码中的某个地方,我必须传递一个Track*
,其中需要IConnectableTrack*
,我得到以下编译错误:
error: ‘IConnectableTrack’ is an ambiguous base of ‘Track’
我知道这是多重继承的问题,但我尝试了virtual
遗传的多种组合无济于事。
特别是,我认为虚拟化红色接口之间的遗传和绿色类之间的遗传(即所有紫色箭头)都足够了,但它无法解决问题。
这里的正确构造是什么?
编辑:这个问题与提到的问题不同,因为它包含纯抽象类,它与引用的特定错误消息有关。
答案 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);
}