7.2.7 Поля Типа

7.2.7 Поля Типа

Чтобы использовать производные классы не просто как удобную сокращенную запись в описаниях, надо разрешить следющую проблему: Если задан указатель типа base*, какому проиводному типу в действительности принадлежит указываемый обект? Есть три основных способа решения этой проблемы:

1. Обеспечить, чтобы всегда указывались только объекты одного типа (#7.3.3),

2. Поместить в базовый класс поле типа, которое смогут просматривать функции и

3. Использовать виртуальные функции (#7.2.8).

Обыкновенно указатели на базовые классы используются при разработке контейнерных (или вмещающих) классов: множество, вектор, список и т.п. В этом случае решение 1 дает однородные списки, то есть списки объектов одного типа. Решения 2 и 3 можно использовать для построения неоднородных списков, то есть списков объектов (указателей на объекты) нескольких раличных типов. Решение 3 – это специальный вариант решения 2 с гарантией типа.

Давайте сначала исследуем простое решение с помощью поля типа, то есть решение 2. Пример со служащими и менеджерами можно было бы переопределить так:

enum empl_type (* M, E *);

struct employee (* empl_type type; employee* next; char* name; short department; // ... *);

struct manager : employee (* employee* group; short level; // уровень *);

Имея это, мы можем теперь написать функцию, которая пчатает информацию о каждом служащем:

void print_employee(employee* e) (* switch (e-»type) (* case E: cout «„ e-“name „„ „ “ „„ e-“department „„ „ “; // ... break; case M: cout „« e-“name «« « “ «« e-“department «« « “; // ... manager* p = (manager*)e; cout «« " уровень " «« p-“level «« « “; // ... break;

*) *)

и воспользоваться ею для того, чтобы напечатать список служащих:

void f() (* for (; ll; ll=ll-»next) print_employee(ll); *)

Это прекрасно работает,особенно в небольшой программе, написанной одним человеком, но имеет тот коренной недостаток, что неконтролируемым компилятором образом зависит от того, как программист работает с типами. В больших программах это обычно приводит к ошибкам двух видов. Первый – это невыполнние проверки поля типа, второй – когда не все случаи case пмещаются в переключатель switch, как в предыдущем примере. Оба избежать достаточно легко , когда программу сначала пишут на бумаге, но при модификации нетривиальной программы, осбенно написанной другим человеком, очень трудно избежать как того, так и другого. Часто от этих сложностей становится труднее уберечься из-за того, что функции вроде print() часто бывают организованы так, чтобы пользоваться общностью класов, с которыми они работают. Например:

void print_employee(employee* e) (* cout «„ e-“name „„ „ “ „„ e-“department „« « “; // ... if (e-“type == M) (* manager* p = (manager*)e; cout «« " уровень " «« p-“level «« « “; // ... *) *)

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

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Текстовые поля

Из книги автора

Текстовые поля Без ввода текста никак не обойтись, потому что без него потеряется смысл создания формы. Рассмотрим поля для ввода текста в одну строку, для многострочного ввода служат другие элементы, которые мы разберем позже. Однострочное поле удобно для ввода имени,


Скрытые поля

Из книги автора

Скрытые поля Вместе с формой можно передавать дополнительную информацию, которая не должна быть видна пользователю.Для передачи служебной информации используются скрытые поля. Они не видны пользователю, однако информация из них передается обработчику. Такая


R.9.6 Битовые поля

Из книги автора

R.9.6 Битовые поля Конструкция описатель-члена, имеющая вид,идентификатор opt : выражение-константазадает битовое поле, длина которого отделяется от его имени двоеточием. Размещение битовых полей в объекте класса зависит от реализации. Поля упаковываются в некоторые


Таблицы и поля

Из книги автора

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


Отличия процедур типа Function от процедур типа Sub

Из книги автора

Отличия процедур типа Function от процедур типа Sub Между процедурами типа Function и типа Sub есть одно существенное отличие: в процедуре типа Function обязательно где-то должен присутствовать по крайней мере один оператор, задающий значение этой функции. При этом используется имя


Поля документа

Из книги автора

Поля документа Поля документа – это расстояние между краем страницы и текстом. Соответственно, чем больше поле, тем меньше текста помещается на странице, и наоборот. В любом документе есть правое, левое, верхнее и нижнее поля. Более широкие поля могут придать документу


12.1.4. Текстовые поля

Из книги автора

12.1.4. Текстовые поля Чтобы отобразить поле для ввода текста и манипулировать им, применяется виджет TkEntry. Как и следовало ожидать, для указания размера, цвета и поведения предусмотрены многочисленные атрибуты. Мы приведем довольно объемный пример, иллюстрирующий


12.3.4. Текстовые поля

Из книги автора

12.3.4. Текстовые поля FOX располагает полезными средствами для ввода текста. В следующем примере демонстрируется применение класса FXTextField для редактирования одной строки. Параметры определяют формат текста. Значение TEXTFIELD_PASSWD скрывает текст, являющийся паролем, TEXTFIELD_REAL


Открытые поля, приватные поля и открытые свойства

Из книги автора

Открытые поля, приватные поля и открытые свойства Заметим, что в указанных выше классах поля данных были определены открытыми только для того, чтобы упростить пример. Конечно, с точки зрения объектно-ориентированного подхода предпочтительнее использовать приватные


Поля

Из книги автора

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


Текстовые поля

Из книги автора

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


2.5.1 Поля

Из книги автора

2.5.1 Поля Использование char для представления двоичной переменой, например, переключателя включено/выключено, может показаться экстравагантным, но char является наименьшим объектом, который в С++ может выделяться независимо. Можно, однако, сгруппировать несколько таких


8.5.14 Поля Бит

Из книги автора

8.5.14 Поля Бит Описатель_члена видаидентификатор opt : константное_выражениеопределяет поле; его длина отделяется от имени поля дветочием. Поля упаковываются в машинные целые; они не являются альтернативой слов. Поле , не влезающее в оставшееся в целом место, помещается в


7. Поля

Из книги автора

7. Поля Признаки слева направо и сверху вниз (рис. 187):• все поля широкие; Рис. 187• все поля узкие или отсутствуют;• поля левые широкие;• поля левые очень узкие или отсутствуют совсем;• поля левые сужающиеся;• поля левые расширяющиеся;• поля левые неровные;• поля правые