У нас есть родительский класс под названием 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 () он использует родительский, а не дочерний
РЕДАКТИРОВАТЬ: после вашего редактирования проблема ясна.
Проблема в том, что вы храните базовые бетонные объекты в контейнере STL. Это создает проблему под названием нарезка объектов.
Когда вы добавляете студента в vector<Student>
, так как распределитель вектора построен на Student
класс, любая дополнительная информация о производных классах просто отбрасывается. Когда вы вставляете элементы в вектор, они становятся базового типа.
Чтобы решить вашу проблему, вы должны использовать vector<Student*>
и хранить непосредственно ссылки на студентов в нем. Таким образом, распределитель просто связан с указателем и не разрезает ваши объекты.
vector<Student*> uniStudent;
...
uniStudent.push_back(s);
uniStudent[0]->study();
Имейте в виду, что вы можете использовать умный указатель управлять всем более надежным способом.
Других решений пока нет …