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

无法将派生类裸指针赋值给基类unique_ptr的技术问题

问题:工厂返回裸指针转std::unique_ptr失败及析构疑问
class Info {
  public:
    virtual bool IsHere() = 0;
    virtual std::wstring GetStr() = 0;
};

class WindowsInfo : public Info {
  public:
    virtual std::wstring GetAnotherStr() = 0;
    bool IsHere() override;
};

class AdvancedWindowsInfo : public WindowsInfo {
  public:
    AdvancedWindowsInfo() {}
    ~AdvancedWindowsInfo() {}

    std::wstring GetAnotherStr() override;
    std::wstring GetStr() override;
};
  
class InfoFactory {
  public:
    static Info* GetInfo();
};
  
class InfoManager {
  public:
    InfoManager();
    //~InfoManager();

    bool IsSomething();

  private:
    std::unique_ptr<Info> info;
};
  
InfoManager::InfoManager() {
  #if WIN
    info = std::make_unique<WindowsInfo>();
  #else  // currently no implementation Linux
    info = nullptr;
  #endif
}
  
bool InfoManager::IsSomething() {
    std::unique_ptr<Info> info = InfoFactory::GetInfo();

    return info && info->IsHere();
}
  
Info* InfoFactory::GetInfo() {
  #if IS_WINDOWS
    return new AdvancedWindowsInfo();
  #else
    return nullptr;
  #endif
}

核心逻辑说明

代码包含抽象基类Info及其派生类WindowsInfo、AdvancedWindowsInfo,InfoFactory工厂类通过静态方法返回派生类裸指针(签名为Info*),InfoManager类使用std::unique_ptr<Info>类型成员。

当前问题

无法实现工厂返回值到std::unique_ptr<Info>的赋值,尝试多种方案均失败:

  • 使用std::make_unique包裹裸指针:仅支持基类,无法适配派生类;
  • 直接将裸指针赋值给unique_ptr:类型转换不被允许;
  • 改用裸指针:编译器提示调用抽象基类析构函数,对此存疑——抽象类无法实例化,为何会调用其析构函数?

内容的提问来源于stack exchange,提问作者conectionist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:10:53