3

我正在做系统编程作业。我必须实施一所大学。我有一个 Course 课程,有子课程 ComputerScience 课程课程、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课程和选修课子类是一样的)在Course类的函数中(不是void,比如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和选修课也是如此!

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

4

3 回答 3

11

CSCourse抽象的。

您已在 中声明了纯虚函数,但未在 中提供reg实现。CourseCSCourse

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

于 2012-11-16T18:01:41.490 回答
1

您从一个很好的抽象类继承,但您永远不会实现基类定义的纯虚函数。

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

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

于 2012-11-16T18:01:32.173 回答
1

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

virtual void reg(Student &s)=0;

所以是的,你的课程是抽象的。

于 2012-11-16T18:01:45.543 回答