c++多态性/纯虚拟函数
c++ polymorphism/pure virtual function
我有一个名为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
。
相关文章:
- C++无法定义虚拟函数 OUTER 类和头文件
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 类型擦除的std::function与虚拟函数调用的开销
- 重写虚拟函数和继承
- 用纯虚拟函数兜圈子
- 为什么使用存储在虚拟方法表中的地址调用虚拟函数的函数会返回垃圾?
- 禁止子函数调用父级的抽象(或虚拟)函数
- 无法在子类中使用虚拟函数C++
- 无法在派生对象上运行虚拟函数
- 我可以调用从 main() 覆盖的虚拟函数吗?
- 在 C++ 中将函数获取和设置为虚拟函数
- 使用在堆栈上创建的对象调用虚拟函数
- 为什么在这种情况下不调用我的虚拟函数实现?
- 在C++中使虚拟函数私有化
- 模板继承类中的虚拟函数
- 为什么构造函数的虚拟函数调用有时有效,但其他调用却无效
- doxygenc++虚拟函数和实现
- 如何从派生类函数中调用虚拟函数