2012-11-16 70 views
2

我正在做一個系統編程作業。 我必須實施一所大學。 我有一門課程,包括ComputerScience課程班,PG課程班和選修課課程。不能分配抽象類型的對象 - 但類不是抽象的! (C++)

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類的功能(這並不作廢,像getSemester和這樣的..)我只是做dynamic_cast的推測什麼類型的課程是嗎。

我有這樣的問題:

coursesVector是:

std::vector<Course*> coursesVector 

和DP變量是包含任一CS,PG或選修的字符串。主要的,我這樣做:

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

它給我「不能分配抽象類型CS課程的對象」。 同樣適用於PG和選修課!

但是,在我的hte類定義中,CS課程不是抽象的!

+0

作爲旁註:在基類中創建一個虛擬析構函數。 – gvd

回答

11

CSCourse摘要。

您已在Course中聲明純虛函數reg,但在CSCourse中未提供實現。

你的編譯器無疑也告訴過你這個。

1

你從一個抽象類繼承,這很好,但你永遠不會實現基類定義的純虛函數。

還需要一個虛擬的析構函數在基類;)

編輯: 你還做其他的事情,可能是沒有必要像重新聲明大部分的派生類的功能。我敢打賭,他們的實現和你的基類完全一樣嗎?

1

您還沒有實現純虛函數reg在派生類中:

virtual void reg(Student &s)=0;

所以,是的,你是一個抽象類。