C++ 无法识别父类的字段
我有一段时间遇到了一个问题,当我试图从纯虚拟类继承时,当我为子类创建构造函数时,我收到以下错误:C++ 无法识别父类的字段,c++,class,inheritance,pure-virtual,C++,Class,Inheritance,Pure Virtual,我有一段时间遇到了一个问题,当我试图从纯虚拟类继承时,当我为子类创建构造函数时,我收到以下错误: ../src/Course.cpp:54:77: error: class ‘ElectiveCourse’ does not have any field named ‘_dptr’ 所有受保护的字段都会发生这种情况 结构如下: 课程h: class Course{ public: virtual void reg(Student * s) = 0; ..
../src/Course.cpp:54:77: error: class ‘ElectiveCourse’ does not have any field named ‘_dptr’
所有受保护的字段都会发生这种情况
结构如下:
课程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) {
}
像选修课一样,我还有两个从课程类继承的其他类,我在所有这些类中都得到了相同的错误。
[编辑]这只发生在它们的构造函数中。
课程类中没有构造函数,因此它是纯虚拟的 另一方面,我还有两个类:Student和CSStudent:Student,其中Student也是纯虚拟的,CSStudent继承Student,在这种情况下没有错误。我对他们两人都做了同样的事。 有什么问题吗? 我为我的语法错误感到抱歉 [编辑] 添加了Course.cpp部分,我在其中得到了错误
谢谢 不能在另一个类中初始化一个类的成员变量。当然,如果您想在构造函数中初始化成员变量,您必须将构造函数添加到课程中。如果愿意,可以使该构造函数受到保护
另一种可能更好的方法是更改设计,使课程成为一个接口。您不能在另一个类中初始化一个类的成员变量。当然,如果您想在构造函数中初始化成员变量,您必须将构造函数添加到课程中。如果愿意,可以使该构造函数受到保护
另一种可能更好的方法是更改设计,使课程成为一个接口。您不能在子类构造函数中初始化父类的字段。原因是构造顺序包括基类的构造,然后才能实际处理其内部字段。而基地的建设需要其内部场的建设。也就是说,为了实现所需的功能,您应该在基类中创建一个构造函数,该构造函数接受所有参数名称、学期等,并从子类构造函数调用此构造函数:
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){}
无法在子类构造函数中初始化父类的字段。原因是构造顺序包括基类的构造,然后才能实际处理其内部字段。而基地的建设需要其内部场的建设。也就是说,为了实现所需的功能,您应该在基类中创建一个构造函数,该构造函数接受所有参数名称、学期等,并从子类构造函数调用此构造函数:
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){}
发布真正的相关代码。请更正您的拼写课程类中没有构造函数,因此它是纯虚拟的。为什么纯虚拟类不应该有构造函数?纯虚只是意味着你必须从类中派生出来,然后才能从中创建对象——但是这些对象的基础部分仍然需要构建,为此构造函数可能是必需的。C++中,每个类都有一个构造函数。如果没有显式声明,编译器将添加默认构造函数。您唯一能做的就是通过声明构造函数为protected或private来限制外部世界对构造函数的访问。因此,您的纯虚拟类确实有一个默认生成的构造函数,甚至还有一个公共构造函数!发布真正的相关代码。请更正您的拼写课程类中没有构造函数,因此它是纯虚拟的。为什么纯虚拟类不应该有构造函数?纯虚只是意味着你必须从类中派生出来,然后才能从中创建对象——但是这些对象的基础部分仍然需要构建,为此构造函数可能是必需的。C++中,每个类都有一个构造函数。如果没有显式声明,编译器将添加默认构造函数。您唯一能做的就是通过声明构造函数为protected或private来限制外部世界对构造函数的访问。因此,您的纯虚拟类确实有一个默认生成的构造函数,甚至还有一个公共构造函数!