Наследование позволяет избежать дублирования лишнего кода при написании классов. Пусть в базе данных ВУЗа должна храниться информация о всех студентах и преподавателях. Представлять все данные в одном классе не получится, поскольку для преподавателей нам понадобится хранить данные, которые для студента не применимы, и наоборот.
Создание базового класса
Для решения этой задачи создадим базовый класс human , который будет описывать модель человека. В нем будут храниться имя, фамилия и отчество.
Создайте файл human.h :
#ifndef HUMAN_H_INCLUDED
#define HUMAN_H_INCLUDED
#include <string>
#include <sstream>
class human {
public:
human(std::string last_name, std::string name, std::string second_name)
{
this->last_name = last_name;
this->name = name;
this->second_name = second_name;
}
std::string get_full_name()
{
std::ostringstream full_name;
full_name << this->last_name << " "
<< this->name << " "
<< this->second_name;
return full_name.str();
}
private:
std::string name;
std::string last_name;
std::string second_name;
};
#endif // HUMAN_H_INCLUDED
Наследование от базового класса
Теперь создайте новый класс student , который будет наследником класса human . Поместите его в файлstudent.h .
#ifndef STUDENT_H_INCLUDED
#define STUDENT_H_INCLUDED
#include "human.h"
#include <string>
#include <vector>
class student : public human {
public:
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;
}
float get_average_score()
{
unsigned int count_scores = this->scores.size();
unsigned int sum_scores = 0;
float average_score;
for (unsigned int i = 0; i < count_scores; ++i) {
sum_scores += this->scores[i];
}
average_score = (float) sum_scores / (float) count_scores;
return average_score;
}
private:
std::vector<int> scores;
};
#endif // STUDENT_H_INCLUDED
Функция get_average_score вычисляет среднее арифметическое всех оценок студента. Все публичные свойства и методы класса human будут доступны в классе student .
|