下面的代码在继承方面有什么问题?获取no matching function for call to ‘student::student()’错误。
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;
student* stu;
public:
undergraduate(string firstname, string lastname, double gpa) {
stu = new student(firstname, lastname);
this->gpa = gpa;
}
};
int main() {
undergraduate stu1("Sam", "Singh", 4.0);
stu1.setfirstname("temp");
cout << stu1.getname();
}请指出错误,并帮助我纠正它。谢谢!
发布于 2021-09-10 13:17:26
看起来您可能是个Python程序员,下面是您的代码,用这个语言重新编写。
class student:
def __init__(self, fname, lname):
self.firstname = fname;
self.lastname = lname;
@property
def name(self):
return self.firstname + self.lastname
class undergraduate(student):
def __init__(self, fname, lname, gpa):
super().__init__(fname, lname)
self.gpa = gpa
stu1 = undergraduate("Sam", "Singh", 4.0);
stu1.firstname = "temp";
print(stu1.name)首先要注意的是,undergraduate不包含student成员。由于它是从student (is a)继承的,所以不需要undergraduate中的成员。对于C++类来说是一样的。
但是,在Python代码中,undergraduate类调用undergraduate ctor主体中的undergraduate ctor。这与C++中的工作方式不同。该语言使用“初始化程序列表”。它们不仅用于调用父ctors,而且用于初始化成员变量。
class student {
private: // You may want to change to protected so child classes can access
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), // Call parent ctor
gpa(gpa) // Initialize this->gpa to gpa parameter
{
// The initializer list has taken care of everything so there's nothing here
// But additional code could be added if needed.
}
};
int main() {
undergraduate stu1("Sam", "Singh", 4.0);
stu1.setfirstname("temp");
cout << stu1.getname();
}如果您对继承的工作方式感到困惑,我强烈建议您找到一本好书或教程。因此,答案不足以充分解释这些概念。
关于代码中的原始错误:编译器正在为student寻找默认的ctor (没有参数),但您没有提供参数。请参阅:我们什么时候需要一个默认的构造函数?
发布于 2021-09-10 13:24:21
undergraduate 是一个 student。因此,undergraduate的构造首先需要构造父类student。
由于您没有提供,所以如何在
undergraduate(string firstname, string lastname, double gpa)
{
stu = new student(firstname, lastname);
this->gpa = gpa;
}在讨论构造函数体之前,编译器将尝试通过调用student的默认构造函数来完成它。由于学生有参数化构造函数student(string fname, string lname),编译器将不会为您生成参数化构造函数,最终不会为学生生成默认构造函数。这会导致错误。
其次,除非有任何其他特殊要求,否则不需要指向父级的指针。
因此,您有两个不同的选项来解决这个问题。
student提供默认构造函数。undergraduate)中初始化undergraduate,删除指向student的冗余指针。还可以使用构造函数成员初始化程序列表初始化类的成员:
undergraduate(string firstname, string lastname, double gpa)
: student{ std::move(firstname), std::move(lastname)}
, gpa{ gpa}
{}https://stackoverflow.com/questions/69132133
复制相似问题