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

C++继承场景gcc编译报use of deleted function的原因及排查咨询

报错含义说明

你遇到的报错指的是:代码第47行尝试以无参构造的方式创建SpecialEdtionBook类的实例book2时,调用了已经被编译器标记为删除的SpecialEdtionBook类无参构造函数,因此编译不通过。

触发该问题的核心原因和C++类继承的构造函数规则有关:

  • 当一个类显式定义了自定义构造函数后,编译器不会再为该类自动生成默认无参构造函数。你的父类Book已经定义了接收三个参数的构造函数,因此Book不存在可用的无参构造函数。
  • 子类如果没有显式定义任何构造函数,编译器尝试为子类生成默认无参构造函数时,需要先调用父类的无参构造函数完成父类部分的初始化。由于父类无参构造不存在,编译器就会直接将子类的默认无参构造函数标记为删除,不允许调用。
这类报错的排查方向
  • 排查父类是否存在可用的无参构造函数:如果父类已经自定义了有参构造,没有额外定义无参构造,子类默认生成的无参构造就会失效。
  • 排查子类是否显式定义了合法的构造函数:如果父类只有有参构造,子类必须在自己的构造函数初始化列表中显式调用父类的有参构造,完成父类成员的初始化。
  • 排查创建子类对象时的传参是否匹配:创建子类对象时传入的参数数量、类型需要和子类已有的构造函数参数列表一致。
修复参考

你可以通过给子类添加适配父类参数的构造函数解决问题,示例如下:

class SpecialEdtionBook : public Book{
public:
    // 子类构造函数,初始化列表调用父类有参构造
    SpecialEdtionBook(string Title, string Author, int Page) : Book(Title, Author, Page) {}

    void Special(){
        cout << "Special editions is out"<< endl;
    }
};

创建子类对象时传入对应参数即可:

SpecialEdtionBook book2("示例书名", "示例作者", 300);

另外注意你原有代码中的toString函数声明返回值为string,但函数内部只做了打印没有返回对应字符串,也会触发编译告警/报错,可以将返回值类型改为void修复该问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 02:45:00