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

如何将派生类unique_ptr存入基类unique_ptr的vector?编译报错求解

解决方法

1. 给基类Fahrzeug添加虚析构函数

这是用unique_ptr实现多态的必要条件——没有虚析构的话,销毁基类指针指向的派生类对象会触发未定义行为,部分编译器会直接拒绝这种类型转换。修改基类代码:

class Fahrzeug {
public:
    virtual ~Fahrzeug() = default;
    // 其他成员定义
};

2. 显式转换或直接构造(可选)

如果加了虚析构仍报错,或者想更明确地控制类型转换,可以显式构造基类unique_ptr:

unique_ptr<PKW> teslatruck = make_unique<PKW>(34,"Tesla Truck",100,30,120);
unique_ptr<Fahrrad> fahrrad = make_unique<Fahrrad>(13,"Fahrrad",30);
vector<unique_ptr<Fahrzeug>> aufgabe2vector;

// 显式转换为基类unique_ptr后存入
aufgabe2vector.push_back(std::unique_ptr<Fahrzeug>(std::move(teslatruck)));
aufgabe2vector.push_back(std::unique_ptr<Fahrzeug>(std::move(fahrrad)));

更简洁的写法是跳过中间变量,直接将make_unique返回的派生类指针存入vector(编译器会自动完成合法的类型转换):

vector<unique_ptr<Fahrzeug>> aufgabe2vector;
aufgabe2vector.push_back(make_unique<PKW>(34,"Tesla Truck",100,30,120));
aufgabe2vector.push_back(make_unique<Fahrrad>(13,"Fahrrad",30));

错误根源

编译报错的核心原因是:

  • 基类无虚析构,编译器阻止不安全的类型转换;
  • 派生类与基类不是公有继承(需确保定义为class PKW : public Fahrzeug)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:45:31