Menu
Coddy logo textTech

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

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

challenge icon

Задание

Легко

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

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

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

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

    <displayInfo output>
    Salary: <displayInfo output>
    Salary: $<calculated salary>lt;calculated salary>

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

Например, при входных данных 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: $<calculated salary>
    //   - Вывести пустую строку между сотрудниками (но не после последнего)
    
    // TODO: Удалить динамически выделенные объекты
    
    return 0;
}

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