如何让TestB复用Hardware类实现?避免C++代码冗余
复用Hardware实现的几种方案
针对你的场景——避免在Test类中重复编写调用Hardware::GetHardwareData()的代码,同时让只继承ISoftwareB的TestB也能复用这个实现,这里提供三种实用方案:
1. 模板Mixin(最推荐)
用模板基类封装复用逻辑,适配任意继承IHardware的软件接口,无需修改原有类结构:
// 原有类定义不变 class IHardware { public: virtual int GetHardwareData() = 0; virtual ~IHardware() = default; }; class Hardware : public IHardware { public: int GetHardwareData() override { // 你的硬件数据获取逻辑 return 42; } }; class ISoftwareA : public IHardware {}; class ISoftwareB : public IHardware {}; // 封装复用逻辑的模板Mixin template<typename SoftwareIf> class HardwareReuse : public SoftwareIf, public Hardware { public: int GetHardwareData() override { // 统一调用Hardware的实现,不用每个Test类重复写 return Hardware::GetHardwareData(); } }; // TestA直接继承模板类,无需自己重载 class TestA : public HardwareReuse<ISoftwareA> { // 你的TestA业务逻辑 }; // TestB同样复用,一步到位 class TestB : public HardwareReuse<ISoftwareB> { // 你的TestB业务逻辑 };
这个方案的好处是:
- 无需修改原有接口的继承方式(不用加
virtual) - 模板适配所有继承
IHardware的软件接口,扩展性强 - 所有复用类都不用重复编写重载代码
2. 非模板中间基类(需虚继承)
如果不想用模板,可以通过虚继承解决菱形继承的二义性,用中间基类封装复用逻辑:
// 修改软件接口为虚继承IHardware,避免多重继承的二义性 class ISoftwareA : virtual public IHardware {}; class ISoftwareB : virtual public IHardware {}; // 中间基类封装调用逻辑 class HardwareReuseBase : virtual public IHardware, public Hardware { public: int GetHardwareData() override { return Hardware::GetHardwareData(); } }; // TestA继承对应接口和中间基类 class TestA : public ISoftwareA, public HardwareReuseBase { // 业务逻辑 }; // TestB同理 class TestB : public ISoftwareB, public HardwareReuseBase { // 业务逻辑 };
注意:必须给IHardware的所有继承链加上virtual,否则会出现多个IHardware实例导致的编译错误。
3. 组合模式(避免多重继承)
如果不想用多重继承,直接在Test类中组合Hardware实例,实现接口方法:
class TestB : public ISoftwareB { private: Hardware hardwareImpl; // 持有Hardware实例 public: int GetHardwareData() override { return hardwareImpl.GetHardwareData(); } // 其他TestB逻辑 };
这种方式更简洁,没有多重继承的复杂度,适合不需要同时继承多个接口的场景。如果多个Test类都需要这样的逻辑,可以把组合逻辑封装成一个辅助类,进一步复用。
内容的提问来源于stack exchange,提问作者Logan Gallois
相关产品推荐
相关产品推荐

