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

C++类继承场景下调用newsucc()提示无匹配函数报错

报错根因

触发error: no matching function for call to 'arch::newsucc()'的核心原因是C++同名隐藏规则:

  • 基类National中定义的虚函数newsucc是无参版本:virtual void newsucc() {}
  • 两个子类arch、IT中定义的newsucc是带两个int形参的版本,和基类虚函数签名完全不一致,既没有重写基类虚函数,还会直接隐藏从基类继承来的无参newsucc()
  • 主函数中调用无参newsucc()时,编译器优先在子类作用域查找同名函数,仅能找到带两个参数的版本,找不到匹配的无参实现,直接抛出参数不匹配的报错。

你之前测试print函数能正常运行,是因为基类和子类的print都是无参版本,函数签名完全一致,不存在隐藏后找不到匹配函数的问题。之前尝试把基类newsucc改成带两个参数的版本依然报错,是因为主函数始终调用无参版本,作用域内依然没有匹配的函数实现。

修复方案

从业务逻辑看,你在构造arch、IT类实例时,已经把考生总数、通过率传入并存到了基类的protected成员students、succ中,newsucc作为统计当前专业上岸人数的方法,完全不需要额外传入参数,修复步骤如下:

  • 移除两个子类中newsucc方法的形参,保持和基类虚函数完全一致的签名,建议加override关键字显式标记虚函数重写,后续如果签名写错编译器会直接提示,降低排查成本
  • 子类newsucc的计算逻辑直接使用继承自基类的students、succ成员变量即可,无需额外传参
  • 额外优化:基类的print方法、析构函数建议加virtual关键字,符合C++多态设计规范,避免子类资源泄漏

修正后的可运行完整代码:

#include <iostream>
#include <string>
using namespace std;

class National {
protected:
    string name;
    int students;
    int succ;

public:
    National()
    {
        name = "";
        students = 0;
        succ = 0;
    }
    National(string ex, int s, int su)
    {
        name = ex;
        students = s;
        succ = su;
    }
    National(National& N) {
        this->name = N.name;
        this->students = N.students;
        this->succ = N.succ;
    }
    virtual void print()
    {
        cout << "The results of the National Exam" << endl;
    }

    virtual void newsucc() { };

    virtual ~National() = default;
};

class arch : public National {
public:
    arch(int _students, int _succ) :National("architecture engineering", _students, _succ)
    {
    }

    void print() override {
        cout << "The National Exam's result of the architecture engineering is: " << endl;
    }
    void newsucc() override
    {
        cout << "The number of the Successful students: " <<  (students * succ) / 100 << endl;
    }
};

class IT : public National
{
public:
    IT (int _students, int _succ) : National("IT engineering", _students, _succ)
    {
    }

    void print() override {
        cout << "The National Exam's result of the IT engineering is: " << endl;
    }
    void newsucc() override
    {
        cout << "The number of the Successful students: " << (students * succ) / 100 << endl;
    }
};

int main()
{
    cout << "-----------------------------------" << endl;
    arch obj2 (300,65);
    obj2.print();
    obj2.newsucc();

    cout << "-----------------------------------" << endl;
    IT obj3 (500,40);
    obj3.print();
    obj3.newsucc();
    return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:36:26