c++多态性/纯虚拟函数

c++ polymorphism/pure virtual function

本文关键字:虚拟 函数 多态性 c++      更新时间:2023-10-16

我有一个名为course的类。课程有一个指针指向一个名为评估的基类。

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

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

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

我的驱动程序代码看起来像这个

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

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

virtual void Report() = 0;

问题是,当我进行评估时,评估中的运算符"<lt;',我正在调用Report()

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

但该报告称之为"评估"报告,而不是"考试评估报告"。不确定我在哪里出了问题(我对C++继承还很陌生)

Course::Course()中,您永远不应该执行

 assessment = &ExamAssessment(45);

你正在使用一个临时工的地址。一旦你离开构造函数的作用域,这将是无效的。我想编译器警告过你了!这解释了你在访问评估时的意外碰撞行为。

Do:

 assessment = new ExamAssessment(45);

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