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

如何将派生类std::unique_ptr转换为基类并传递所有权?

问题根源与解决方法

你的代码编译失败的核心原因是派生类采用了默认的private继承,C++中类继承默认权限为private,这导致Der1/Der2无法隐式转换为Base类型,进而std::unique_ptr<Der1>无法转换成std::unique_ptr<Base>。

修复步骤

  1. 将派生类的继承方式改为public,确保基类接口对外部可见
  2. 给基类添加虚析构函数,避免unique_ptr销毁对象时出现内存泄漏
  3. 推荐用成员初始化列表直接初始化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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 18:50:31