ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн

Иерархия классов

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

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

В базе данных хранятся имена служащих всех категорий и их идентифика- ционные номера. Однако в информации о менеджерах содержится еще и назва- ние их должности и их взносы в гольф-клубы, а в информации об ученых — количество опубликованных статей.

Пример нашей программы начинается с описания базового класса employee. Этот класс содержит фамилии служащих и их номера. Он порождает три новых класса: manager, scientist и laborer. Классы manager и scientist содержат добавоч- ную информацию об этих категориях служащих. Это показано на рис. 9.5.

Рис. 9.5. Диаграмма классов UML для примера EMPLOY

Далее рассмотрим листинг программы EMPLOY:

// employ.cpp

// пример написания базы данных сотрудников с использованием наследования #include  <iostream>

using namespace std;

const int LEN = 80;       // максимальная длина имени

///////////////////////////////////////////////////////////

class employee            // некий сотрудник

{

  private:

    char name[ LEN ];     // имя сотрудника

    unsigned long number; // номер сотрудника

  public:

    void getdata ( )

      {

        cout << "\n  Введите фамилию: "; cin >> name;

        cout << "  Введите номер: ";     cin >> number;

      }

    void putdata ( ) const

      {

        cout << "\n  Фамилия: " << name;

        cout << "\n  Номер: " << number;

      }

};

///////////////////////////////////////////////////////////

class manager : public employee // менеджер

{

  private:

    char title[ LEN ];    // должность, например вице-президент

    double dues;          // сумма взносов в гольф-клуб

  public:

    void getdata ( )

      {

        employee::getdata ( );

        cout << "  Введите должность: "; cin >> title;

        cout << "  Введите сумму взносов в гольф-клуб: "; cin >> dues;

      }

    void putdata ( ) const

      {

        employee::putdata ( );

        cout << "\n  Должность: " << title;

        cout << "\n  Сумма взносов в гольф-клуб: " << dues;

      }

};

///////////////////////////////////////////////////////////

class scientist : public employee // ученый

{

  private:

    int pubs;                     // количество публикаций

  public:

    void getdata ( )

      {

        employee::getdata ( );

        cout << "  Введите количество публикаций: "; cin >> pubs;

      }

    void putdata ( ) const

      {

        employee::putdata ( );

        cout << "\n  Количество публикаций: " << pubs;

      }

};

 

///////////////////////////////////////////////////////////

class laborer : public employee   // рабочий

{

};

///////////////////////////////////////////////////////////

int main ( )

{

  manager m1, m2;

  scientist s1;

  laborer l1;

 

  // введем информацию о нескольких сотрудниках

  cout << endl;

  cout << "\nВвод информации о первом менеджере";

  m1.getdata ( );

 

  cout << "\nВвод информации о втором менеджере";

  m2.getdata ( );

 

  cout << "\nВвод информации о первом ученом";

  s1.getdata ( );

 

  cout << "\nВвод информации о первом рабочем";

  l1.getdata ( );

 

  // выведем полученную информацию на экран

  cout << "\nИнформация о первом менеджере";

  m1.putdata ( );

 

  cout << "\nИнформация о втором менеджере";

  m2.putdata ( );

 

  cout << "\nИнформация о первом ученом";

  s1.putdata ( );

 

  cout << "\nИнформация о первом рабочем";

  l1.putdata ( );

 

  cout << endl;

  return 0;

}

В функции main() этой программы объявлены четыре объекта различных классов: два объекта класса manager, объект класса scientist и объект класса laborer. (Конечно, объектов могло быть много больше, но при этом вывод про- граммы стал бы довольно объемным.) Они вызывают метод getdata() для полу- чения информации о каждом из служащих и метод putdata(), обеспечивающий вывод этой информации. Рассмотрим простое взаимодействие с программой EMPLOY. Сначала пользователь вводит данные.

Ввод информации о первом менеджере Введите фамилию: Иванов Введите номер: 1 Введите должность: директор Сумма взносов в гольф-клуб: 10000

Ввод информации о втором менеджере Введите фамилию: Парнашвили Введите номер: 7

Введите должность: заместитель директора Сумма взносов в гольф-клуб: 15000 Ввод информации о первом ученом Введите фамилию: Подрезов Введите номер: 18 Введите количество публикаций: 54 Ввод информации о первом рабочем Введите фамилию: Сидорук Введите номер: 1634 Затем программа выводит введенную информацию. Информация о первом менеджере Фамилия: Иванов Номер: 1

Должность: директор Сумма взносов в гольф-клуб: 10000 Информация о втором менеджере Фамилия: Парнашвили Номер: 7

Должность: заместитель директора Сумма взносов в гольф-клуб: 15000 Информация о первом ученом Фамилия: Подрезов Номер: 18

Количество публикаций: 54 Информации о первом рабочем Фамилия: Сидорук Номер: 1634

Более сложная программа будет использовать для размещения данных массив или другую структуру, которая приспособлена для хранения большого количе- ства информации о служащих.

 

21