You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:35:49