如何同时实现SpecInterface并复用MyServiceImpl的fun1实现?
问题描述
我们有如下接口定义:
// interface template <typename T> class MyInterface { public: virtual void fun1() = 0; virtual void fun2() = 0; }; // 仅做特化,保持纯虚 class SpecInterface: public MyInterface<int> { };
对应的实现代码如下:
// interface_impl template <typename T> class MyServiceImpl : public MyInterface<T> { virtual void fun1() override { std::cout << "concrete MyService f1" << std::endl; } // 未实现fun2 }; class SpecInterfaceImpl : public SpecInterface { // 希望复用MyServiceImpl::fun1的实现 virtual void fun2() override { std::cout << "concrete SpecService f2" << std::endl; } };
现在需要实现SpecInterface接口,同时复用MyServiceImpl::fun1的实现,尝试过多重继承但未成功,该如何操作?
解决方案
方法一:虚继承解决菱形继承二义性
直接多重继承SpecInterface和MyServiceImpl<int>会导致MyInterface<int>存在两个实例,引发调用二义性。通过虚继承可以让基类MyInterface<int>只存在一个实例:
步骤1:修改接口层的继承为虚继承
// interface template <typename T> class MyInterface { public: virtual void fun1() = 0; virtual void fun2() = 0; }; // 虚继承MyInterface<int> class SpecInterface: public virtual MyInterface<int> { }; // MyServiceImpl同样改为虚继承MyInterface<T> template <typename T> class MyServiceImpl : public virtual MyInterface<T> { virtual void fun1() override { std::cout << "concrete MyService f1" << std::endl; } };
步骤2:多重继承实现类
class SpecInterfaceImpl : public SpecInterface, public MyServiceImpl<int> { virtual void fun2() override { std::cout << "concrete SpecService f2" << std::endl; } };
此时MyInterface<int>只有一个实例,fun1由MyServiceImpl<int>提供,fun2由SpecInterfaceImpl实现,完全满足需求。
方法二:组合替代继承(更灵活)
如果不想用虚继承,用组合的方式把MyServiceImpl<int>作为成员变量,直接调用其fun1实现:
class SpecInterfaceImpl : public SpecInterface { private: MyServiceImpl<int> impl; public: virtual void fun1() override { impl.fun1(); // 复用MyServiceImpl的fun1逻辑 } virtual void fun2() override { std::cout << "concrete SpecService f2" << std::endl; } };
这种方式避免了继承带来的耦合问题,也不会出现菱形继承的困扰,代码逻辑更清晰。
方法三:Mixin类复用功能
把MyServiceImpl改成Mixin类(仅提供功能实现,不继承接口),由子类整合到接口中:
// 改为Mixin,不继承MyInterface template <typename T> class MyServiceMixin { public: void fun1() { std::cout << "concrete MyService f1" << std::endl; } }; class SpecInterfaceImpl : public SpecInterface, public MyServiceMixin<int> { virtual void fun1() override { MyServiceMixin<int>::fun1(); // 调用Mixin的实现 } virtual void fun2() override { std::cout << "concrete SpecService f2" << std::endl; } };
Mixin类专注于提供特定功能,子类负责将其与接口绑定,也是一种常用的复用手段。
内容的提问来源于stack exchange,提问作者Eric Qiang
相关产品推荐
相关产品推荐

