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
相关产品推荐
相关产品推荐

