【问题标题】:"X is an ambiguous base of Y": Multiple inheritance nightmare“X 是 Y 的模棱两可的基数”:多重继承的噩梦
【发布时间】:2018-03-14 01:36:54
【问题描述】:

下面是我的类层次结构。

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

所有箭头代表继承。

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

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

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

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

特别是,我认为虚拟化红色接口之间的继承和绿色类之间的继承(即所有紫色箭头)就足够了,但这并不能解决问题。

这里的正确结构是什么?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 好的,我也试过了,但是在编译之前明显没有正确清理。这行得通。
猜你喜欢
  • 1970-01-01
  • 2012-06-26
  • 2012-09-29
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多