ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В 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
Более сложная программа будет использовать для размещения данных массив или другую структуру, которая приспособлена для хранения большого количе- ства информации о служащих.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42