无法将派生类裸指针赋值给基类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
相关产品推荐
相关产品推荐

