2013-11-21 158 views
0

我有一個叫做course的類。課程有一個指向名爲Assessment的基類的指針。C++多態/純虛函數

class Course{ 
    char* courseName; 
    float fee; 

public: 
    Assessment* assessment; 
    Course(); 
    Course(Course&); 
    Course(char*, float, Assessment *); 
    ~Course(); 
    friend ostream& operator <<(ostream& os, Course&); 
}; 

Strickly用於測試目的,在構造函數中我指定的評估指針的ExamAssessment(子類)

Course::Course(){ 
    courseName = "something"; 
    fee = 0; 
    assessment = &ExamAssessment(45); 
} 

我的司機的代碼如下所示

Course t = Course(); 
cout << *(t.assessment); 

在評估中,報告是純虛擬的

virtual void Report() = 0; 

問題是,當我清點評估,在評估重載運算符「< <」,我打電話報告()

ostream& operator<<(ostream& os, Assessment& assessment){ 
    assessment.Report(); 
    os << "Course Grade: "<< assessment.grade << endl; 
    return os; 
} 

但報告呼籲「評估」報告,而不是ExamAssessments報告。不知道在哪裏,我本打算錯誤的(我是相當新的C++繼承)

+0

你怎麼知道這是調用'評估'報告? – wimh

+0

編譯器告訴我'純虛函數被稱爲' –

回答

2

在你Course::Course()你永遠不應該這樣做

assessment = &ExamAssessment(45); 

你正在做一個臨時的地址。只要您超出構造函數範圍,這將無效。我認爲編譯器警告過你! 這可以解釋當您訪問評估時您的崩潰意外行爲。

做:

assessment = new ExamAssessment(45); 

而作爲@邁克爾K. Sondej說,在析構函數刪除它。或使用std::unique_ptr

+3

當然''刪除評估;'在析構函數中。 –

+0

是的,它的工作:)。仍然崩潰的地方,但它正在打印右大聲笑 –