C++使用vector存储unique_ptr时子类虚函数未被正确重写是什么原因?
问题原因
你遇到的是**C++对象切片(Object Slicing)**问题,和vector、unique_ptr本身的使用逻辑无关,错误出在智能指针的构造步骤:
你写的std::make_unique<A>(B())逻辑是:
- 先构造一个临时的
B类实例 - 用这个
B实例作为参数,调用A的拷贝构造函数,在堆上生成一个纯A类型的对象 - 最终
unique_ptr<A>指向的是这个被切掉了所有派生类信息的A对象,自然不会触发多态调用B的print方法。
修复方案
直接构造派生类B的智能指针即可,派生类的智能指针可以安全隐式转换为基类的智能指针:
int main() { std::vector<std::unique_ptr<A>> ass; // 把make_unique的模板参数改为B,不需要手动传B()参数 ass.emplace_back(std::make_unique<B>()); ass[0]->print(); // 此时会正确输出 B HEJ std::cin.get(); }
额外注意
涉及多态的基类建议显式声明虚析构函数,避免后续释放对象时出现未定义行为:
class A { public: virtual void print() { printf("A HEJ"); } // 新增虚析构函数 virtual ~A() = default; };
内容的提问来源于stack exchange,提问作者kurry
相关产品推荐
相关产品推荐

