Загружаем изображение…
Глава 13. Наследование классов
Сделаем класс Person абстрактным базовым классом (АБК), так как в контексте школы не может быть просто человека. Абстрактный класс задаёт общие черты, а специфику мы делаем в производных классах. Для создания АБК нам необходимо "занулить" виртуальную функцию, стоит помнить, что объекты нельзя создавать.
Код:
Код в main.cpp
Консоль:
Name: Peter
Age: 12
Grade: 5
Average score: 4.5
Role: student
Name: Izolda
Age: 55
Subject: History
Salary: 27500
Role: Teacher
Name: Antonio
Age: 77
Subject: Math
Salary: 90000
Role: VicePrincipal
Managed 1 class
Name: Antonioresky
Age: 78
Subject: Math
Salary: 90100
Role: VicePrincipal
Managed 2 classes
Name: Oleg
Age: 50
Subject: informatics
Salary: 100000
Role: Principal
Managed 5 classes
Budget: 300000
Мы видим, что переопределенный метод Role() работает в каждом классе, даже, если мы подключаем часть Show() из наследуемого класса.
Сделаем класс Person абстрактным базовым классом (АБК), так как в контексте школы не может быть просто человека. Абстрактный класс задаёт общие черты, а специфику мы делаем в производных классах. Для создания АБК нам необходимо "занулить" виртуальную функцию, стоит помнить, что объекты нельзя создавать.
Код:
//заголовочный файл person.h
#pragma once
#include <string>
class Person {
protected:
std::string m_name;
int m_age;
public:
Person() : m_name("Noname"), m_age(0) {}
Person(std::string name, int age) : m_name(name), m_age(age) {}
virtual void Show() const = 0;
virtual std::string Role() const = 0;
};
class Student : public Person {
private:
int m_grade;
double m_averageScore;
public:
Student() : Person("Noname", 0), m_grade(0), m_averageScore(0.0) {}
Student(std::string name, int age, int grade, double averageScore)
: Person(name, age), m_grade(grade), m_averageScore(averageScore) {
}
void Show() const {
std::cout << "Name: " << m_name << std::endl
<< "Age: " << m_age << std::endl
<< "Grade: " << m_grade << std::endl
<< "Average score: " << m_averageScore << std::endl
<< "Role: " << Role() << std::endl;
}
std::string Role() const {
return "student";
}
};
class Teacher : public Person {
protected:
std::string m_subject;
double m_salary;
public:
Teacher(std::string n, int a, std::string s, double sal)
: Person(n, a), m_subject(s), m_salary(sal) {
}
void Show() const {
std::cout << "Name: " << m_name << std::endl
<< "Age: " << m_age << std::endl
<< "Subject: " << m_subject << std::endl
<< "Salary: " << m_salary << std::endl
<< "Role: " << Role() << std::endl;
}
std::string Role() const override { return "Teacher"; }
double Salary() const { return m_salary; }
};
class VicePrincipal : public Teacher {
int m_yearsOfExperience;
int m_classesManaged;
public:
VicePrincipal(std::string n, int a, std::string s, double sal, int y, int c)
: Teacher(n, a, s, sal), m_yearsOfExperience(y), m_classesManaged(c) {
}
void Show() const {
Teacher::Show();
std::cout << "Managed " << m_classesManaged;
m_classesManaged > 1 ? std::cout << " classes" : std::cout << " class";
std::cout << std::endl;
}
std::string Role() const { return "VicePrincipal"; }
};
class Principal : public VicePrincipal {
double m_schoolBudget;
public:
Principal(std::string n, int a, std::string s, double sal, int y, int c, double b)
: VicePrincipal(n, a, s, sal, y, c), m_schoolBudget(b) {
}
void Show() const {
VicePrincipal::Show();
std::cout << "Budget: " << m_schoolBudget << std::endl;
}
std::string Role() const override { return "Principal"; }
};
Код в main.cpp
//main.cpp
#include <iostream>
#include "person.h"
int main() {
Student Peter("Peter", 12, 5, 4.5);
Teacher t1("Izolda", 55, "History", 27500);
VicePrincipal vp1("Antonio", 77, "Math", 90000, 57, 1);
VicePrincipal vp2("Antonioresky", 78, "Math", 90100, 58, 2);
Principal p1("Oleg", 50, "informatics", 100000, 30, 5, 300000);
Person* school[5] = { &Peter, &t1, &vp1, &vp2, &p1 };
for (int i = 0; i < 5; ++i) {
school[i]->Show();
std::cout << std::endl;
}
return 0;
}
Консоль:
Name: Peter
Age: 12
Grade: 5
Average score: 4.5
Role: student
Name: Izolda
Age: 55
Subject: History
Salary: 27500
Role: Teacher
Name: Antonio
Age: 77
Subject: Math
Salary: 90000
Role: VicePrincipal
Managed 1 class
Name: Antonioresky
Age: 78
Subject: Math
Salary: 90100
Role: VicePrincipal
Managed 2 classes
Name: Oleg
Age: 50
Subject: informatics
Salary: 100000
Role: Principal
Managed 5 classes
Budget: 300000
Мы видим, что переопределенный метод Role() работает в каждом классе, даже, если мы подключаем часть Show() из наследуемого класса.