Основы программирования

Новые типы С++ - Иерархия Типов
Индекс материала
Новые типы С++
Классы и Члены
Классы
Инициализация
Очистка
Интерфейсы и Реализации
Законченный Класс
Друзья и Объединения
Вложенные Классы
Структуры и Объединения
Конструкторы и Деструкторы
Предостережение
Свободная Память
Вектора Объектов Класса
Небольшие Объекты
Предостережение
Упражнения
Перегрузка Операций
Функции Операции
Предопределенный Смысл Операций
Конструкторы
Константы
Присваивание и Инициализация
Индексирование
Вызов Функции
Класс String
Синтаксис вызова функции
Предостережение
Упражнения
Производные Классы
Производные Классы
Функции
Видимость
Указатели
Иерархия Типов
Конструкторы и Деструкторы
Поля Типа
Виртуальные Функции
Альтернативные Интерфейсы
Реализация
Как Этим Пользоваться
Обработка Ошибок
Обобщенные Классы
Ограниченные Интерфейсы
Добавление к Классу
Неоднородные Списки
Администратор Экрана
Библиотека Фигур
Прикладная Программа
Свободная Память
Упражнения
Все страницы

7.2.5 Иерархия Типов

Производный класс сам может быть базовым классом. Например:

class employee (* ... *); class secretary : employee (* ... *); class manager : employee (* ... *); class temporary : employee (* ... *); class consultant : temporary (* ... *); class director : manager (* ... *); class vice_president : manager (* ... *); class president : vice_president (* ... *);


Такое множество родственных классов принято называть ирархией классов. Поскольку можно выводить класс только из оного базового класса, такая иерархия является деревом и не может быть графом более общей структуры. Например:

class temporary (* ... *); class employee { ... *); class secretary : employee (* ... *);

// не С++: class temporary_secretary : temporary : secretary(* ... *); class consultant : temporary : employee (* ... *);

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

class temporary (* ... *); class employee (* ... *); class secretary : employee (* ... *);

// Альтернатива: class temporary_secretary : secretary (* temporary temp; ... *); class consultant : employee (* temporary temp; ... *);

Это выглядит неэлегантно и страдает как раз от тех пролем, для преодоления которых были изобретены производные классы. Например, поскольку consultant не является произвоным от temporary, consultant'а нельзя помещать с список врменных служащих (temporary employee), не написав специальный код. Однако во многих полезных программах этот метод успешно используется.



 
greenwich line