C++20中避免代码重复:虚继承替代方案咨询
C++20 替代虚继承解决代码复用的方案
问题背景
现有行为型接口Base,定义如下:
class Base { virtual void general_functionality() = 0; virtual void general_functionality1() = 0; };
抽象类CommonBaseForDynamicApp继承Base,新增动态层级数据相关接口:
class CommonBaseForDynamicApp : public Base { virtual void apply_dynamic_logic() = 0; };
已实现三类具体结构:
- 基于Json的动态实现
CommonBaseForJsonDynamicAppImpl1 - 基于Yaml的动态实现
CommonBaseForYamlDynamicAppImpl1 - Json静态实现
CommonBaseForJsonStaticApp
但静态与动态实现存在大量代码重复,原方案通过虚继承复用CommonForJson代码,因担心耦合过强,寻求C++20下更优替代方案。
方案1:CRTP(奇异递归模板模式)实现静态复用
CRTP通过编译期静态多态实现代码复用,避免虚继承的运行时开销与耦合问题。将通用逻辑抽离为模板基类,静态/动态类分别继承并传入自身类型:
通用Json逻辑CRTP基类
template<typename Derived> class CommonForJsonCRTP : public Base { public: void general_functionality() override { // 通用Json逻辑实现 } void general_functionality1() override { // 通用Json逻辑实现 } };
静态类实现
class CommonBaseForJsonStaticApp : public CommonForJsonCRTP<CommonBaseForJsonStaticApp> { // 静态特有的扩展逻辑(按需添加) };
动态类实现
class CommonBaseForJsonDynamicAppImpl : public CommonBaseForDynamicApp, public CommonForJsonCRTP<CommonBaseForJsonDynamicAppImpl> { public: void apply_dynamic_logic() override { // 动态逻辑实现 } // 解决基类同名函数二义性(按需添加) using CommonForJsonCRTP<CommonBaseForJsonDynamicAppImpl>::general_functionality; using CommonForJsonCRTP<CommonBaseForJsonDynamicAppImpl>::general_functionality1; };
方案2:组合替代继承(优先推荐)
遵循组合优于继承的设计原则,将通用Json逻辑封装为独立组件,静态/动态类通过持有组件实例复用代码,完全消除继承耦合:
通用Json功能组件
class JsonCommonLogic { public: void general_functionality() { // 通用Json逻辑实现 } void general_functionality1() { // 通用Json逻辑实现 } };
静态类实现
class CommonBaseForJsonStaticApp : public Base { private: JsonCommonLogic json_logic_; public: void general_functionality() override { json_logic_.general_functionality(); } void general_functionality1() override { json_logic_.general_functionality1(); } // 静态特有的扩展逻辑 };
动态类实现
class CommonBaseForJsonDynamicAppImpl : public CommonBaseForDynamicApp { private: JsonCommonLogic json_logic_; public: void general_functionality() override { json_logic_.general_functionality(); } void general_functionality1() override { json_logic_.general_functionality1(); } void apply_dynamic_logic() override { // 动态逻辑实现 } };
该方案让组件类可独立演化,静态/动态类职责更清晰,符合单一职责原则。
方案3:C++20 概念(Concepts)强化接口约束
配合上述组合/CRTP方案,用C++20概念实现编译期接口约束,替代部分运行时多态检查,同时给出更友好的编译错误提示:
定义接口概念
#include <concepts> template<typename T> concept BaseConcept = requires(T t) { { t.general_functionality() } -> std::same_as<void>; { t.general_functionality1() } -> std::same_as<void>; }; template<typename T> concept DynamicBaseConcept = BaseConcept<T> && requires(T t) { { t.apply_dynamic_logic() } -> std::same_as<void>; };
概念的应用示例
template<DynamicBaseConcept T> void process_dynamic_data(T& instance) { instance.general_functionality(); instance.apply_dynamic_logic(); }
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

