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

C++中用单个模板基类替代多抽象基类的可行性及实现

用模板基类替代重复的抽象构建器基类

完全不需要维护多个结构重复的基类——C++的模板机制就是为这种“仅类型参数不同”的场景设计的,单个模板基类就能替代所有重复的A/B/C类。

模板基类实现

首先定义一个模板基类,将产品类型作为模板参数,把重复的逻辑封装进去:

#include <memory> // 用于智能指针管理内存

template<typename ProductType>
class BaseBuilder {
protected:
    // 纯虚构建方法,返回对应产品类型的指针
    virtual ProductType* Build() = 0;
public:
    // 获取产品的公共接口,内部调用Build并处理内存
    ProductType GetProduct() {
        std::unique_ptr<ProductType> productPtr(Build());
        return *productPtr; // 可根据需求调整为返回指针/智能指针
    }

    // 基类必须声明虚析构,避免派生类对象销毁时的内存泄漏
    virtual ~BaseBuilder() = default;
};

派生类实现

派生类只需要继承模板基类时指定具体的产品类型,然后实现Build方法即可,写法简洁且逻辑清晰:

// 定义具体的产品类型(对应原代码的returnType1/2/3)
class Product1 {};
class Product2 {};
class Product3 {};

// 对应原D类
class D : public BaseBuilder<Product1> {
protected:
    Product1* Build() override { // 用override显式标注重写,避免签名错误
        // 替换为你的实际构建逻辑
        return new Product1();
    }
};

// 对应原E类
class E : public BaseBuilder<Product2> {
protected:
    Product2* Build() override {
        return new Product2();
    }
};

// 对应原F类
class F : public BaseBuilder<Product3> {
protected:
    Product3* Build() override {
        return new Product3();
    }
};

关键注意点

  • 内存管理:原代码中Build返回裸指针,建议在GetProduct中用智能指针(如std::unique_ptr)接管所有权,避免手动管理内存导致泄漏。
  • 虚析构:模板基类必须声明虚析构函数,否则用BaseBuilder*指针指向派生类对象并销毁时,只会调用基类析构,派生类资源无法正确释放。
  • override关键字:显式使用override可让编译器检查是否正确重写基类虚函数,避免因函数签名不一致(如返回类型写错)导致的隐式错误。

内容的提问来源于stack exchange,提问作者MUSTAFA KANDEMİR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:30:05