c ++多态/纯虚函数

时间:2013-11-21 16:04:09

标签: c++ polymorphism pure-virtual

我有一个叫做课程的课程。课程有一个指向名为Assessment的基类的指针。

class Course{
    char* courseName;
    float fee;

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

严格用于测试目的,在构造函数中我将评估指针分配给ExamAssessment(子类)

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

我的驱动程序代码如下所示

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

在评估中,报告是纯粹的虚拟

virtual void Report() = 0;

问题是我在评估时,在评估重载运算符'&lt;&lt;'时,我正在调用Report()

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

但该报告称为“评估报告”而非“考试报告”。不确定我在哪里出错(我对C ++继承相当新)

1 个答案:

答案 0 :(得分:2)

在你的Course::Course()中,你永远不应该这样做

 assessment = &ExamAssessment(45);

你正在拿一个临时的地址。一旦你离开构造函数范围,那将是无效的。我认为编译器会警告你! 这可以解释您在访问评估时遇到的崩溃意外行为。

执行:

 assessment = new ExamAssessment(45);

正如@Michael K. Sondej所说,在析构函数中删除它。或者使用std::unique_ptr