最后,我遇到了下面的情况。
我有一个没有外部库的纯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库中的构造函数非常烦人。即使没有虚拟(据我所知,这会导致内存中的类重复,并且有很多歧义需要解决),我仍然存在一些构造函数错误(对于没有默认构造函数的类,“没有合适的默认构造函数”等等)。
长期以来,我一直在努力解决这个问题,我希望更有经验的人能够提出建议,为我的代码结构或问题提供更好的解决方案。
发布于 2022-03-20 23:52:10
最后,我用作文解决了这个问题:
将constructor.
的函数。
IDevice指针保存对cppLibDevice的引用,现在可以转换到它所属的任何子类。缺点:我不能覆盖call类,但这对我的代码来说并不是一个困难的要求,因为我在ExternalLib类中创建了替代函数,这些函数可以选择性地调用cppLibDevice函数,或者完全替换它们。
https://stackoverflow.com/questions/71488243
复制相似问题