Конструктор базового класса
Для того, чтобы инициализировать конструктор родительского класса (в нашем случае — это сохранение имени, фамилии и отчества ученика), используется следующий синтаксис:
student(
) : human(
) {
}
В конструктор класса human мы передаем инициалы человека, которые сохраняются в экземпляре класса. Для класса students , нам необходимо задать еще и список оценок студента. Поэтому конструкторstudents принимает все аргументы конструктора базового класса, а также дополнительные аргументы для расширения функционала:
student(
std::string last_name,
std::string name,
std::string second_name,
std::vector<int> scores
) : human(
last_name,
name,
second_name
) {
this->scores = scores;
}
Список оценок студента хранится в векторе.
Создание объекта класса student
Реализуем пользовательский интерфейс для работы с классом student .
#include <iostream>
#include <vector>
#include "human.h"
#include "student.h"
int main(int argc, char* argv[])
{
std::vector<int> scores;
scores.push_back(5);
scores.push_back(3);
scores.push_back(2);
scores.push_back(2);
scores.push_back(5);
scores.push_back(3);
scores.push_back(3);
scores.push_back(3);
scores.push_back(3);
student *stud = new student("Петров", "Иван", "Алексеевич", scores);
std::cout << stud->get_full_name() << std::endl;
std::cout << "Средний балл: " << stud->get_average_score() << std::endl;
return 0;
}
В этом примере мы написали программу, которая создает объект класса student , сохраняя в нем его имя, фамилию, отчество и список оценок.
После инициализации объекта, происходит вывод полного имени студента с помощью функцииget_full_name . Эта функция была унаследована от базового класса human .
Затем программа вычислияет средний балл студента и выводит его на экран. Этим занимается функцияget_average_score , которую мы описали внутри класса student .
Мы реализовали часть функционала для нашей базы данных института (я конечно утрирую, когда оперирую столь серьезными высказываниями про настоящую базу данных :)
Создание класса-наследника teacher
Нужно создать еще один класс, в котором будут храниться данные преподавателей. Дадим ему название —teacher . Как вы уже поняли, мы не будем описывать все методы этого класса с нуля, а просто унаследуем его от класса human . Тогда, не нужно будет реализовывать хранение имени, фамилии и отчества препода. Это уже есть в базовом классе human .
Создайте файл teacher.h :
#ifndef TEACHER_H_INCLUDED
#define TEACHER_H_INCLUDED
#include "human.h"
#include <string>
class teacher : public human {
public:
teacher(
std::string last_name,
std::string name,
std::string second_name,
unsigned int work_time
) : human(
last_name,
name,
second_name
) {
this->work_time = work_time;
}
unsigned int get_work_time()
{
return this->work_time;
}
private:
unsigned int work_time;
};
#endif // TEACHER_H_INCLUDED
У класса teacher появилось новое свойство — количество учебных часов, отведенное преподавателю на единицу времени (семестр). Весь остальной функционал наследуется от базового класса human . Если бы мы писали все с нуля, то одинакового кода бы получилось в разы больше, и его поддержка усложнилась бы на порядок.
Создание объекта класса teacher
Изменим содержимое файла main.cpp , чтобы проверить работу класса teacher .
#include <iostream>
#include "human.h"
#include "teacher.h"
int main(int argc, char* argv[])
{
unsigned int teacher_work_time = 40;
teacher *tch = new teacher("Васильков", "Петр", "Сергеевич", teacher_work_time);
std::cout << tch->get_full_name() << std::endl;
std::cout << "Количество часов: " << tch->get_work_time() << std::endl;
return 0;
}
Если сборка программы прошла без ошибок, то результат работы программы будет таким:
Можно таким же образом создать класс, в котором будут храниться данные обслуживающего персонала или руководящего состава. Наследование используют, когда у каждой группы объектов есть общие параметры, но для каждой из этих групп нужно хранить более кастомные данные.
Также, мы можем создать класс, который будет описывыть студента заочной формы обучения. Его мы унаследовали бы от класса student , добавив какие-либо дополнительные данные.
В класс human можно добавить еще больше свойств, которые будут описывать данные, имеющиеся у любого человека. Например, номер паспорта, дату рождения, прописку и место проживания.
Подобный подход позволяет в разы уменьшить дублирование кода в реальных проектах, и упросить его поддержку.
Когда нужно использовать конструктор
Если у класса много свойств — их совсем не обязательно задавать в конструкторе. Для сохранения отдельных свойств класса используют set-функции. Например, для сохранения номера паспорта, можно создать публичный метод set_passport_number(std::string number) , который будет принимать значение свойства и сохранять его в объекте, через переменную this .
|