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

C++中shared_ptr指向派生类的赋值及链接错误问题求助

第一个错误:shared_ptr赋值不匹配的修复

你遇到的operator=不匹配错误,核心原因是Derived采用了默认的private继承。C++中类的默认继承权限是private,这意味着Derived和Base的继承关系在类外部不可见,std::shared_ptr<Derived>无法隐式转换为std::shared_ptr<Base>(这种转换要求继承是public的,保证类型兼容性)。

修正方法:把Derived的继承方式显式改为public,同时将Derived的构造函数设为public(否则std::make_shared无法创建实例):

class Derived : public Base {
public:
  Derived() {}
  void do_stuff() override; // 建议加override关键字,明确重写基类虚函数
};

void Derived::do_stuff() {
  // 编写具体逻辑
}

第二个错误:链接错误的原因与修复

改成public继承后出现的undefined reference to ‘Base::Base()’,是因为你只声明了Base的构造函数,但未提供实现。

Base类中声明了Base();,但既没有在类内定义(比如Base() {}),也没有在类外实现。当Derived的构造函数被调用时,会自动调用Base的构造函数,链接器找不到该构造函数的具体实现,就会抛出这个错误。

修复方式有两种:

  • 若Base不需要自定义构造逻辑,直接删除Base();的声明,编译器会自动生成默认构造函数。
  • 显式提供构造函数实现,比如在类内定义:
class Base
{
public:
  Base() = default; // 显式生成默认构造,或写成Base() {}
  virtual void do_stuff() = 0;
  virtual ~Base() = default; // 额外建议:基类必须加虚析构,避免shared_ptr释放时内存泄漏
};

额外提醒:Base作为含纯虚函数的抽象基类,必须声明虚析构函数,否则std::shared_ptr<Base>指向Derived对象时,释放内存只会调用Base的非虚析构函数,导致Derived的资源无法正确释放,引发内存泄漏。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:57:26