c++ - 重写虚函数不起作用,头文件和 C++ 文件

标签 c++ inheritance overriding virtual

我们有一个名为 Student 的父类。我们有一个子类:StudentCS。

学生.h:

#include <iostream.h>
#include<string.h>
#include<vector.h>
#include "Course.h"
class Course;

class Student {
public:
    Student();
    Student(int id, std::string dep, std::string image,int elective);
    virtual ~Student();
    virtual void Study(Course &c) const;  // this is the function we have a problem with
    void setFailed(bool f);
[...]

};

学生.cpp:

#include "Student.h"

[...]

void  Student::Study(Course &c) const {

}

我们有 StudentCS.h:

#include "Student.h"
class StudentCS : public Student {
public:
StudentCS();
virtual ~StudentCS();
StudentCS (int id, std::string dep, std::string image,int elective);
void Study(Course &c) const;
void Print();
};

和 StudentCS.cpp:

void StudentCS:: Study (Course &c) const{
    //25% to not handle the pressure!
    int r = rand()%  100 + 1;
cout << r << endl;
if (r<25) {
    cout << student_id << " quits course " << c.getName() << endl;
}

 }

我们主要创建学生:

Student *s;
vector <Student> uniStudent;
[...]
    if(dep == "CS")
        s = new  StudentCS(student_id,dep,img,elective_cs);
    else
        s = new StudentPG(student_id,dep,img,elective_pg);

    uniStudent.push_back(*s);

然后我们调用study,但是我们得到的是parent study,而不是child! 请帮忙!

代码可以编译,但在 uniStudent.Study() 上运行和调用时,它使用父项而不是子项

最佳答案

编辑:编辑后问题就很清楚了。

问题是您将基础具体对象存储在 STL 容器中。这会产生一个名为 object slicing 的问题.

当您将学生添加到 vector<Student> 时,因为 vector 的分配器是建立在 Student 上的类,派生类的所有附加信息都将被丢弃。一旦将元素插入 vector 中,它们就会变成基本类型。

要解决您的问题,您应该使用 vector<Student*>并在其中直接存储对学生的引用。所以分配器只与指针相关,不会分割你的对象。

vector<Student*> uniStudent;
...
uniStudent.push_back(s);
uniStudent[0]->study();

请注意,您可能想要使用 smart pointer以更稳健的方式管理一切。

关于c++ - 重写虚函数不起作用,头文件和 C++ 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13499665/

相关文章:

css - Chrome CSS级联

c++ - 表达式: Sequence not ordered

c++ - 使用gcc插件修改变量声明的顺序

javascript - 在 Backbone 中访问父类

generics - 可空类型的类型层次结构中的位置是什么?

c# - 如何覆盖未标记为虚拟的事件处理程序?

c++ - 子类的虚函数和非虚函数的区别

c++ - 什么是 SCARY 迭代器?

c++ - 打开流的多个文本文件

java - 协方差在这里安全吗?