не может выделить объект абстрактного типа — но класс не является абстрактным! (C ++)

Я делаю домашнее задание по системному программированию.
Я должен реализовать университет.
У меня есть курс курса, с дочерними классами, курсами ComputerScience, классами PG и курсами по выбору.

class Course
{
public:
virtual void teach();
virtual void reg(Student &s)=0;
std::string getName();
std::string getDepartment();
int getSemester();
int getMinGrade();
void addStudent(Student *s);
void removeStudent(Student *s);

protected:
std::string _department;
std::string _name;
int _semester;
int _minGrade;
std::vector<Student*> studentsList;
};

class CSCourse : public Course
{
public:
CSCourse();
CSCourse(std::string department, std::string name, int semester, int mingrade);
~CSCourse();
std::string getName();
std::string getDepartment();
int getSemester();
int getMinGrade();
void addStudent(Student *s);
void removeStudent(Student *s);
};

(Курсы PG и курсы по выбору для детей одинаковы)
В функциях класса Course (которые не являются пустыми, например, getSemester и т. Д.), Я просто выполняю dynamic_cast, чтобы выяснить, какой это тип курса.

У меня возникла эта проблема:

курсыВектор это:

std::vector<Course*> coursesVector

и переменная dp — это строка, содержащая либо CS, PG, либо Elective. В основном я делаю это:

if (dp == "CS")
{
CSCourse *csCourse = new CSCourse(dp, name, semester, minGrade);
coursesVector.push_back(csCourse);
}

это дает мне «Не удается выделить объект абстрактного типа CS курс».
То же самое касается PG и Elective!

Но, по моему определению, курс CS не является абстрактным!

2

Решение

CSCourse учебный класс является Аннотация.

Вы объявили чисто виртуальную функцию reg в Course, но не предоставлена ​​реализация в CSCourse,

Ваш компилятор, несомненно, сказал вам именно это.

11

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

Вы наследуете от абстрактного класса, что нормально, но вы никогда не реализуете чисто виртуальную функцию, которую определяет базовый класс.

Также вам нужен виртуальный деструктор в вашем базовом классе;)

Редактировать:
Вы также делаете другие вещи, которые, вероятно, не нужны, например, повторное выделение большинства функций вашего производного класса. Могу поспорить, что их реализация точно так же, как ваш базовый класс?

1

Вы не реализовали чисто виртуальную функцию reg в вашем производном классе:

virtual void reg(Student &s)=0;

Так что да, ваш класс абстрактный.

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