如何将派生类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
相关产品推荐
相关产品推荐

