C++ 重写虚拟函数不工作、头文件和c++;文件夹

C++ 重写虚拟函数不工作、头文件和c++;文件夹,c++,inheritance,overriding,virtual,C++,Inheritance,Overriding,Virtual,我们有一个叫学生的家长班。我们有一个儿童班: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 el

我们有一个叫学生的家长班。我们有一个儿童班: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);
[...]

};
我们有学生C.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;
}

 }
void StudentCS::Study(Course&c)const{
//25%不处理压力!
int r=rand()%100+1;

cout编辑:编辑后问题就清楚了

问题是您正在STL容器中存储基础混凝土对象。这会产生一个名为的问题

当您将学生添加到
向量
时,由于向量的分配器构建在
学生
类上,因此有关派生类的所有附加信息都将被丢弃。在向量中插入元素后,它们将变为基类型

要解决您的问题,您应该使用
向量
,并在其中直接存储对学生的引用。因此,分配器只与指针相关,而不分割对象

vector<Student*> uniStudent;
...
uniStudent.push_back(s);
uniStudent[0]->study();
vector uniStudent;
...
一名学生。向后推;
uniStudent[0]->study();

请注意,您可能希望使用a以更强大的方式管理所有内容。

您是否会在程序中正常调用student虚拟函数?将student设置为抽象基类并将student设置为纯虚拟函数可能是一个好主意。student中有一些函数我们将使用。当我尝试将study设置为纯虚拟函数时l通过以下方式发挥作用:[虚拟虚空研究(课程与c)=0;]并且删除它没有编译的.cpp文件中的植入。它肯定没有编译,因为调用了父方法,这意味着虚拟调用不起作用,因此
StudentCS
错过了它的vtable。您没有明确说明StudentCS源自Student,尽管能够分配指针而不强制转换意味着是的。我很想相信这段代码并不代表你的实际问题。现在编辑它以显示大多数StudentCS.h..好的,我现在编辑它一点以使事情更清楚问题在于向量uniStudent,我希望它的每个单元格都有不同类型的学生,并从该类型调用study函数,但现在我该如何处理uniStudent的所有函数?uniStudent[0]。study()以前不起作用?*uniStudent[0]。study()也不起作用??因为它们是指针,您需要使用正确的(
->
)运算符来访问对象的成员。
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);
vector<Student*> uniStudent;
...
uniStudent.push_back(s);
uniStudent[0]->study();