首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >双重可怕的钻石继承问题(允许其他解决办法)

双重可怕的钻石继承问题(允许其他解决办法)
EN

Stack Overflow用户
提问于 2022-03-15 19:54:45
回答 1查看 62关注 0票数 0

最后,我遇到了下面的情况。

我有一个没有外部库的纯CPP库,另一个项目是用于与外部库接口的SDK。

名字前面的"I“表示一个抽象类。箭头表示继承。

我有IDevice,它包含作为回调的HandleInput(数据)和StartDevice()。然后我有了一种更具体的设备类型: ISmartwatch (包含StartTimer),从它继承了一个更具体的版本SmartwatchV1,它根据需要实现HandleInput(数据)。

在我进入外部SDK部分之前,这一切看起来都很棒,库希望我使用继承来与它进行接口,以覆盖一些函数。因此,我必须继承外部库和我自己的CPP库,才能重写我需要的函数。这些库中的大多数覆盖任何设备(IExternalLibDevice),但有几个是特定于确切的秒表版本(ExternallSmartWatchV1)的。

然后,对于我的SDK中的多态性,我想调用和覆盖库和我自己的设备示例提供的函数: libDevice.StartDevice(),并在这个可选的覆盖StartDevice中使用库调用。或stopWatch.StartTimer()、秒表V1.Library Or ()。我需要创建的对象是绿色对象,然而,白色SmartWatchV1也是一个无需库的应用程序中实例化的对象。(显然,我还记得未来的任何替代设备或秒表版本。)

我想,如果我删除任何继承箭头,我要么会失去多态(这样SDK代码只适用于非常特定的智能手表版本),要么我就不能覆盖我所需要的函数了。构图很好,但不适用于覆盖功能,或者有一个我不知道的选项?

所以我就在这里结束了。我在实现这一点时遇到了一些恼人的错误,因为双钻石通常是通过虚拟继承解决的(关于双钻石的不错页面:https://isocpp.org/wiki/faq/multiple-inheritance#mi-diamond)。但是,在这里应用时(请参阅在映像中表示“虚拟”的v),我有一个继承应该是虚拟的,而不是虚拟的。此外,虚拟继承使我的通用CPP库中的构造函数非常烦人。即使没有虚拟(据我所知,这会导致内存中的类重复,并且有很多歧义需要解决),我仍然存在一些构造函数错误(对于没有默认构造函数的类,“没有合适的默认构造函数”等等)。

长期以来,我一直在努力解决这个问题,我希望更有经验的人能够提出建议,为我的代码结构或问题提供更好的解决方案。

EN

回答 1

Stack Overflow用户

发布于 2022-03-20 23:52:10

最后,我用作文解决了这个问题:

将constructor.

  • In

  • 中设置的IDevice指针添加到IExternalLibDevice :向构造函数添加ISmartwatch指针并将其传递给其父构造函数。另外,添加一个作为ISmartwatch.

  • In ExternalSmartwatchV1检索IDevice指针的函数:还向构造函数中添加SmartwatchV1并将其传递给其父构造函数,并创建一个将IDevice指针检索为SmartwatchV1.

的函数。

IDevice指针保存对cppLibDevice的引用,现在可以转换到它所属的任何子类。缺点:我不能覆盖call类,但这对我的代码来说并不是一个困难的要求,因为我在ExternalLib类中创建了替代函数,这些函数可以选择性地调用cppLibDevice函数,或者完全替换它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71488243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档