如何为已定义类型新增继承关系以适配侵入式SmartPointer?
实现方案说明
该需求完全可以实现,核心思路是通过模板派生类同时继承原有业务类和智能指针要求的基类,完美复用原有类的全部逻辑,完全不会侵入原有类的定义。
核心模板实现
template <typename OriginT, typename SmartBaseT> class InheritsFrom : public OriginT, public SmartBaseT { public: // 完美转发构造函数,兼容原有类的所有构造参数形式 template<typename... Args> InheritsFrom(Args&&... args) : OriginT(std::forward<Args>(args)...) {} // 可选:隐式转换运算符,兼容原有接收OriginT指针/引用的业务代码 operator OriginT& () { return *this; } operator const OriginT& () const { return *this; } operator OriginT* () { return this; } operator const OriginT* () const { return this; } // 可选:显式获取原类型接口,避免隐式转换带来的意料外问题 OriginT* get_origin() { return this; } const OriginT* get_origin() const { return this; } };
实际使用示例
// 原有业务类完全不做任何修改,保持纯净 class HttpClient { public: HttpClient(int timeout) { /* 原有构造逻辑 */ } void get(const std::string& url) { /* 原有业务逻辑 */ } }; // 定义适配后可搭配SmartPointer使用的目标类型 using HttpClientAdapted = InheritsFrom<HttpClient, SmartPtr>; // 定义配套的智能指针别名 using HttpClientSP = SmartPointer<HttpClientAdapted>; // 调用示例 int main() { // 可以和原有类完全一样的方式构造适配类 HttpClientSP sp = new HttpClientAdapted(3000); // 直接调用原有类的所有成员函数 sp->get("https://example.com"); return 0; }
注意事项
- 实现前需要确认
SmartPtr基类和原有业务类没有重名的成员,否则会出现名字隐藏问题,需要额外通过using OriginT::xxx的方式引入冲突成员 - 如果原有业务类需要支持多态,需要将原类的析构函数声明为虚函数,避免派生类释放时出现内存泄漏
- 隐式转换运算符可根据团队编码规范选择是否开启,关闭后主动调用
get_origin()即可适配原有业务接口
内容的提问来源于stack exchange,提问作者user384126
相关产品推荐
相关产品推荐

