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

C++使用vector存储unique_ptr时子类虚函数未被正确重写是什么原因?

问题原因

你遇到的是**C++对象切片(Object Slicing)**问题,和vector、unique_ptr本身的使用逻辑无关,错误出在智能指针的构造步骤:
你写的std::make_unique<A>(B())逻辑是:

  1. 先构造一个临时的B类实例
  2. 用这个B实例作为参数,调用A的拷贝构造函数,在堆上生成一个纯A类型的对象
  3. 最终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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 17:06:01