2012-11-21 50 views
2

我们有一个名为Student的父类。我们有一个孩子班:StudentCS。覆盖虚函数不工作,头文件和C++文件

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叫()时,它使用的父母,而不是孩子

+0

你会永远在你的程序中调用学生虚函数吗?让学生成为一个抽象的基类并将学习设置为一个纯虚函数可能是一个好主意。 –

+0

我们将使用学生的功能。当我尝试通过做[虚拟无效研究(课程&c) =0;]并删除.cpp文件中的植入)来尝试研究纯虚函数时,它没有编译。 –

+0

它确实没有编译,因为父方法是这意味着虚拟invokation不起作用,因此'StudentCS'错过了它的虚表。 – Jack

回答

6

编辑:在您编辑后的问题是显而易见的。

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

当您将学生添加到vector<Student>时,由于向量的分配器构建在Student类上,因此每个关于派生类的附加信息都会被丢弃。一旦你在矢量中插入元素,它们就变成了基本类型。

要解决您的问题,您应该使用vector<Student*>并直接存储对其中的学生的引用。所以分配器只和指针有关,不会切分你的对象。您可能需要使用smart pointer在一个更强大的方式来管理一切

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

心灵。

+0

好吧我编辑了一下,现在让事情更清楚问题是与向量uniStudent我想每个它的细胞有不同类型的学生,并呼吁从该类型的学习功能 –

+0

好吧,我想我发现你的问题。 – Jack

+0

但现在我怎么称呼uniStudent的功能? uniStudent [0] .study()无法正常工作吗? * uniStudent [0] .study()不起作用? –