我有一段时间遇到问题,当我尝试从纯虚拟类继承时,当我为“son”类创建构造函数时,我收到此错误:
../src/Course.cpp:54:77: error: class ‘ElectiveCourse’ does not have any field named ‘_dptr’
所有课程受保护的字段都会发生这种情况。
这是结构:
Course.h:
class Course{
public:
virtual void reg(Student * s) = 0;
..
protected:
...
string _dptr;
...
};
然后:
class ElectiveCourse : public Course{
...
}
Course.cpp:
ElectiveCourse::ElectiveCourse(
string name,
int semester,
double minGrade
)
: _dptr("CS"), _name(name), _semester(semester), _minGrade(minGrade) {
}
与ElectiveCourse一样,我还有另外两个继承自Course类的类,我在所有类中都遇到了同样的错误。 [编辑]这只发生在它们的构造函数中。 “课程”类中没有构造函数,因此它是纯虚拟的。
另一方面,我也有两个classe:Student和CSStudent:Student,其中Student也是纯虚拟的,CSStudent继承Student,在这种情况下没有错误。我在两者中都做了同样的事情。 什么似乎是问题? 对不起我的语法错误。
[编辑] 添加了Course.cpp部分,我收到错误。
谢谢!
答案 0 :(得分:3)
您无法在另一个类中初始化一个类的成员变量。如果要在构造函数中初始化Course的成员变量,则必须向Course添加构造函数。如果您愿意,可以使该构造函数受到保护。
另一种选择(可能更好)是改变你的设计,使课程成为一个界面。
答案 1 :(得分:3)
您无法在子类构造函数中初始化父类的字段。原因是构造顺序包括基类的构造,然后才能实际处理其内部字段。基地的建设需要建设其内部领域。也就是说,为了实现你所需要的,你应该在你的基类中创建一个构造函数,它接受你所有的参数(名称,学期等)并从你的子类构造函数中调用这个构造函数:
Course::Course(string name,
int semester,
double minGrade):
_dptr("CS"),
_name(name),
_semester(semester),
_minGrade(minGrade){}
ElectiveCourse::ElectiveCourse(string name,
int semester,
double minGrade):
Course(name, semester, minGrade){}