不能分配抽象类型的对象 - 但类不是抽象的!(C++)

cannot allocate object of abstract type - but the class is not abstract! (C++)

本文关键字:抽象的 C++ 抽象 分配 不能分 抽象类 类型 对象 不能      更新时间:2023-10-16

我正在做系统编程作业。我必须实施一所大学。我有一个课程类,有子类计算机科学课程类,PG课程类和选修课程类。

class Course
{
public:
    virtual void teach();
    virtual void reg(Student &s)=0;
    std::string getName();
    std::string getDepartment();
    int getSemester();
    int getMinGrade();
    void addStudent(Student *s);
    void removeStudent(Student *s);
protected:
    std::string _department;
    std::string _name;
    int _semester;
    int _minGrade;
    std::vector<Student*> studentsList;  
};
class CSCourse : public Course
{
public:
    CSCourse();
    CSCourse(std::string department, std::string name, int semester, int mingrade);
    ~CSCourse();
    std::string getName();
    std::string getDepartment();
    int getSemester();
    int getMinGrade();
    void addStudent(Student *s);
    void removeStudent(Student *s);
};

(PG课程和选修课程儿童课程相同)在课程类中的函数中(不是无效的,如getSemester等)。我只是dynamic_cast弄清楚它是什么类型的课程。

我遇到了这个问题:

课程向量是:

std::vector<Course*> coursesVector

dp 变量是包含 CS、PG 或 Elective 的字符串。总的来说,我这样做:

if (dp == "CS")
{
    CSCourse *csCourse = new CSCourse(dp, name, semester, minGrade);
    coursesVector.push_back(csCourse);
}

它给了我"无法分配抽象类型 CS 课程的对象"。PG和选修课也是如此!

但是,在我的课程定义中,CS课程并不抽象!

CSCourse抽象的。

您在Course中声明了一个纯虚函数reg,但没有在CSCourse中提供实现。

毫无疑问,您的编译器也准确地告诉您了这一点。

你继承自一个抽象类,这很好,但你从来没有实现基类定义的纯虚函数。

此外,您的基类中需要一个虚拟析构函数;

编辑:您还在执行其他可能不必要的操作,例如重新声明大多数派生类函数。 我敢打赌它们的实现与您的基类完全相同?

您尚未在派生类中实现纯虚函数reg

virtual void reg(Student &s)=0;

所以是的

,你的类是抽象的。