наследование — не работает переопределение виртуальной функции, файлы заголовков и файлы c ++

У нас есть родительский класс под названием 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 () он использует родительский, а не дочерний

2

Решение

РЕДАКТИРОВАТЬ: после вашего редактирования проблема ясна.

Проблема в том, что вы храните базовые бетонные объекты в контейнере STL. Это создает проблему под названием нарезка объектов.

Когда вы добавляете студента в vector<Student>, так как распределитель вектора построен на Student класс, любая дополнительная информация о производных классах просто отбрасывается. Когда вы вставляете элементы в вектор, они становятся базового типа.

Чтобы решить вашу проблему, вы должны использовать vector<Student*> и хранить непосредственно ссылки на студентов в нем. Таким образом, распределитель просто связан с указателем и не разрезает ваши объекты.

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

Имейте в виду, что вы можете использовать умный указатель управлять всем более надежным способом.

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector