如何将派生类std::unique_ptr转换为基类并传递所有权?
问题根源与解决方法
你的代码编译失败的核心原因是派生类采用了默认的private继承,C++中类继承默认权限为private,这导致Der1/Der2无法隐式转换为Base类型,进而std::unique_ptr<Der1>无法转换成std::unique_ptr<Base>。
修复步骤
- 将派生类的继承方式改为
public,确保基类接口对外部可见 - 给基类添加虚析构函数,避免
unique_ptr销毁对象时出现内存泄漏 - 推荐用成员初始化列表直接初始化
Owner的成员指针,提升效率
修正后的完整代码
#include <iostream> #include <memory> class Base { public: virtual void doSmth() = 0; // 必须添加虚析构,保证派生类对象能被正确销毁 virtual ~Base() = default; }; // 修改为public继承Base class Der1 : public Base { public: void doSmth() final { std::cout << "Hello from der1\n"; } }; class Der2 : public Base { public: void doSmth() final { std::cout << "Hello from der2\n"; } }; class Owner { public: // 用成员初始化列表直接移动初始化,避免冗余操作 Owner(std::unique_ptr<Base> passedptr) : ptr(std::move(passedptr)) {} std::unique_ptr<Base> ptr; }; int main() { auto der = std::make_unique<Der1>(); Owner owner(std::move(der)); // 现在可正常完成转换与所有权传递 owner.ptr->doSmth(); // 也可以直接创建并传递,写法更简洁 Owner owner2(std::make_unique<Der2>()); owner2.ptr->doSmth(); }
关键说明
std::unique_ptr本身支持派生类到基类的隐式转换,但仅在public继承且基类有虚析构的前提下安全生效- 虚析构是基类的必要配置,否则
unique_ptr<Base>销毁对象时只会调用基类析构,派生类的资源无法被释放,引发内存泄漏
内容的提问来源于stack exchange,提问作者SavedowW
相关产品推荐
相关产品推荐

