C++继承场景下出现no matching function for call to ‘student::student()’错误如何解决
问题报错原因
- 核心错误是派生类
undergraduate构造函数未显式调用基类student的带参构造函数:C++派生类对象构造时会优先构造基类子对象,如果派生类构造函数的初始化列表没有指定调用基类的某个构造函数,编译器会默认尝试调用基类的无参构造函数。但你的基类student已经自定义了接收两个string参数的构造函数,编译器不会自动生成默认无参构造函数,因此触发no matching function for call to ‘student::student()’报错。 - 额外逻辑错误:
undergraduate已经是student的公有派生类,自身已经继承了基类的所有成员属性,不需要额外定义student* stu指针成员再单独创建基类对象,属于冗余设计,还会造成内存泄漏,同时你在main中调用的setfirstname、getname实际操作的是继承来的基类子对象,和你额外new的stu指向的对象完全无关,逻辑不统一。 - 原代码还缺失必要的头文件引入和命名空间声明,即使修复继承问题也会报
string、cout未定义的错误。
修正方案
- 补充
<iostream>、<string>头文件和必要的命名空间声明 - 删掉
undergraduate类中冗余的student* stu成员 - 修改
undergraduate的构造函数,在初始化列表显式调用基类student的带参构造函数,完成基类子对象的初始化
修正后可正常运行的代码
#include <iostream> #include <string> using namespace std; class student { private: string firstname; string lastname; public: student(string fname, string lname) { firstname = fname; lastname = lname; } string getname() { return firstname + lastname; } void setfirstname(string fname) { this->firstname = fname; } }; class undergraduate : public student { private: double gpa; public: // 初始化列表显式调用基类带参构造 undergraduate(string firstname, string lastname, double gpa) : student(firstname, lastname) { this->gpa = gpa; } }; int main() { undergraduate stu1("Sam", "Singh", 4.0); stu1.setfirstname("temp"); cout << stu1.getname(); return 0; }
内容的提问来源于stack exchange,提问作者taurus05
相关产品推荐
相关产品推荐

