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来限制外部世界对构造函数的访问。因此,您的纯虚拟类确实有一个默认生成的构造函数,甚至还有一个公共构造函数!