Menu
Coddy logo textTech

Итоги — Иерархия сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по C++ на Coddy. Урок 55 из 104.

challenge icon

Задание

Легко

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

Вы организуете код в четырех файлах:

  • Employee.h: Определите базовый класс Employee, от которого будут наследоваться все типы сотрудников. У каждого сотрудника есть имя, идентификатор и базовая зарплата. Включите:
    • Защищенные члены для имени (std::string), идентификатора (int) и baseSalary (double)
    • Конструктор, который инициализирует все три значения
    • Виртуальный метод displayInfo(), который выводит: Employee: <name> (ID: <id>)
    • Виртуальный метод calculateSalary(), который возвращает базовую зарплату
    • Виртуальный деструктор
  • Manager.h: Определите класс Manager, который публично наследуется от Employee. Менеджеры получают бонус в зависимости от размера своей команды:
    • Приватный член int teamSize
    • Конструктор, принимающий имя, идентификатор, базовую зарплату и размер команды: корректно вызовите конструктор базового класса
    • Переопределите displayInfo(), чтобы он выводил: Manager: <name> (ID: <id>) - Team of <teamSize>
    • Переопределите calculateSalary(), чтобы он возвращал базовую зарплату плюс 500 за каждого члена команды
  • Developer.h: Определите класс Developer, который публично наследуется от Employee. У разработчиков есть специализированный язык и бонус за навыки:
    • Приватный член std::string language
    • Конструктор, принимающий имя, идентификатор, базовую зарплату и язык программирования
    • Переопределите displayInfo(), чтобы он выводил: Developer: <name> (ID: <id>) - <language>
    • Переопределите calculateSalary(), чтобы он возвращал базовую зарплату плюс бонус за навыки в размере 1000
  • main.cpp: Считайте шесть значений (каждое в отдельной строке):
    1. Имя Manager
    2. Идентификатор Manager
    3. Базовая зарплата Manager
    4. Имя Developer
    5. Идентификатор Developer
    6. Базовая зарплата Developer

    Создайте Manager с размером команды 4 и Developer, специализирующегося на "C++". Сохраните указатели на обоих в массиве указателей Employee*. Выполните Loop по массиву, чтобы вызвать displayInfo() и вывести рассчитанную зарплату для каждого сотрудника в следующем формате:

    <displayInfo output>
    Salary: $<calculated salary>

    Выведите пустую строку между сотрудниками. После отображения всех сотрудников корректно удалите динамически выделенные объекты.

Например, для inputs Sarah, 101, 5000, Mike, 102 и 4500:

Manager: Sarah (ID: 101) - Team of 4
Salary: $7000

Developer: Mike (ID: 102) - C++
Salary: $5500

Эта задача демонстрирует полиморфизм в действии: вызов виртуальных методов через указатели на базовый класс приводит к вызову правильных реализаций производных классов. Не забудьте использовать ключевое слово override и включить виртуальный деструктор в базовый класс для корректной очистки.

Попробуйте сами

#include <iostream>
#include <string>
#include "Employee.h"
#include "Manager.h"
#include "Developer.h"

using namespace std;

int main() {
    // Прочитать входные данные Manager
    string managerName;
    int managerId;
    double managerSalary;
    
    getline(cin, managerName);
    cin >> managerId;
    cin >> managerSalary;
    cin.ignore();
    
    // Прочитать входные данные Developer
    string developerName;
    int developerId;
    double developerSalary;
    
    getline(cin, developerName);
    cin >> developerId;
    cin >> developerSalary;
    
    // TODO: Создать Manager с размером команды 4
    // TODO: Создать Developer, который специализируется на "C++"
    
    // TODO: Создать массив указателей Employee* для хранения обоих сотрудников
    
    // TODO: Пройти по массиву и для каждого сотрудника:
    //   - Вызвать displayInfo()
    //   - Вывести: Salary: $<рассчитанная зарплата>
    //   - Вывести пустую строку между сотрудниками (не после последнего)
    
    // TODO: Удалить динамически выделенные объекты
    
    return 0;
}

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор C++