模板基类指针用法困惑:运行时多态实现方案咨询
问题场景
这是一个常规的多态设计场景,但存在特殊限制:
template<typename Params> class Base { Base(Params& params): params_(params) { } virtual void run() = 0; Params params_; }; class Derived1: public Base<Derived1Params> { Derived1(Derived1Params& params): Base(params) { } void run() { } };
由于模板的存在,无法用常规的「基类指针指向派生类对象」实现运行时多态,比如下面的写法会报错:
Base* bp; // 错误!!! Derived1 dr; bp = &dr;
请问该场景下的最佳设计模式是什么?
最佳解决方案:引入非模板抽象顶层基类
核心思路是拆分类层次:先定义一个不带模板的纯虚基类作为统一接口,让原模板Base类继承这个顶层基类。这样所有基于不同Params的派生类,都能通过顶层基类的指针/引用实现运行时多态。
具体实现代码如下:
// 非模板顶层抽象基类,提供统一的多态接口 class IBase { public: virtual ~IBase() = default; // 必须声明虚析构,避免子类对象通过基类指针释放时内存泄漏 virtual void run() = 0; }; // 原模板基类继承IBase,保留对Params的适配能力 template<typename Params> class Base : public IBase { public: Base(Params& params): params_(params) {} virtual void run() = 0; protected: Params params_; // 改为protected,方便派生类直接访问(可选优化) }; class Derived1: public Base<Derived1Params> { public: Derived1(Derived1Params& params): Base(params) {} void run() override { // 显式使用override关键字,提升代码可读性和安全性 // 这里实现Derived1的业务逻辑,可直接访问params_ } };
修改后就能正常实现多态调用了:
IBase* bp; Derived1Params params1; Derived1 dr(params1); bp = &dr; bp->run(); // 正确调用Derived1的run方法
这种方案既保留了原模板类对不同参数类型的适配灵活性,又通过顶层非模板基类打通了运行时多态的路径,是这类场景下的标准解决方式。
内容的提问来源于stack exchange,提问作者user3443615
相关产品推荐
相关产品推荐

