覆盖虚函数不起作用,头文件和c ++文件

时间:2012-11-21 18:24:00

标签: c++ inheritance override virtual

我们有一个名为Student的父类。我们有一个儿童班:StudentCS。

Student.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);
[...]

};

Student.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);

然后我们打电话去学习,但是我们得到了父母的学习,而不是孩子! 请帮忙!

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

1 个答案:

答案 0 :(得分:6)

编辑:编辑后问题很明显。

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

当您将学生添加到vector<Student>时,由于向量的分配器是在Student类上构建的,因此只会丢弃有关派生类的所有其他信息。一旦在向量中插入元素,它们就变成了基类型。

要解决您的问题,您应该使用vector<Student*>并直接存储对其中学生的引用。因此,分配器只与指针相关,不会对对象进行切片。

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

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