Программирование >>  Расширенная версия языка c++ 

1 ... 114 115 116 [ 117 ] 118 119 120 ... 227


Глава 12

. .,i.;i;V,.

Динамическая идентификация и приведение типов


В этой главе рассказывается о двух сравнительно новых инструментах C++: динамической идентификации типа (Run-Time Туре Identification, RTTI) и новых, более совершенных операторах приведения типов (casting operators). Динамическая идентификация типа дает возможность определить тип объекта во время выполнения программы. Новые операторы приведения типов предоставляют более безопасные и управляемые способы выполнения операций приведения типов, по сравнению с существовавшими ранее. Как вы увидите в дальнейшем, один из операторов приведения типов, а именно оператор dvnamic cast, относится непосредственно к RTTI, поэтому имело

смысл объединить эти две темы в одной главе.

Повторение пройденного

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

1. Что такое родовая функция и какова ее основная форма?

2. Что такое родовой класс и какова его основная форма?

3. Напишите родовую функцию возвращающую значение одного из своих аргументов, возведенного в степень другого.

4. В главе 9, раздел 9.7, пример 1 был создан класс coord для хранения целочисленных координат. Создайте родовую версию этого класса, чтобы можно было хранить координаты любого типа. Продемонстрируйте программу решения этой задачи.

5. Кратко объясните, как совместная работа инструкций catch и throw обеспечивает в C++ обработку исключительных ситуаций.

6. Можно ли использовать инструкцию throw, если ход выполнения программы не затрагивает инструкции, расположенные в блоке try?

7. Для чего служат функции и

8. Какая форма инструкции catch будет обрабатывать все типы исключительных ситуаций?



12.1. Понятие о динамической идентификации типа

Поскольку динамическая идентификация типа не характерна для языков программирования, в которых не поддерживается полиморфизм (например, С), это понятие может оказаться для вас неизвестным. В языках, в которых не поддерживается полиморфизм, информация о типе объекта во время выполнения программы просто не нужна, так как тип каждого объекта известен уже на этапе компиляции программы (вернее даже тогда, когда программа еще пишется). С другой стороны, в языках, поддерживающих полиморфизм (таких, как C++), возможны ситуации, в которых тип объекта на этапе компиляции неизвестен, поскольку до выполнения программы не определена точная природа объекта. Как вы знаете, в C++ полиморфизм реализуется через иерархии классов, виртуальные функции и указатели базовых классов. При таком подходе указатель базового класса может использоваться либо для указания на объект базового класса, либо для указания на объект любого класса, производного от этого базового. Следовательно, не всегда есть возможность заранее узнать тип объекта, на который будет указывать указатель базового класса в каждый данный момент времени. В таких случаях определение типа объекта должно происходить во время выполнения программы, а для этого служит механизм динамической идентификации типа.

Информацию о типе объекта получают с помощью оператора typeid. Для использования оператора typeid в программу следует включить заголовок <typeiiifo>. Ниже представлена основная форма оператора typeid:

.Г; . ; \

typaidi {объект) . . t ,

Здесь объект - этот тот объект, информацию о типе которого необходимо получить. Оператор typeid возвращает ссылку на объект типа type info, который и описывает тип объекта объект. В классе type iiifo определены следующие открытые члены:

bool pperator= (const type info йоЬвкт) ; ; i

bool operator ! = (const type info боЛьвет) ;

bool before (const type info fio6 e*:a>) ; : - -

const char *na:ine(); . i . .

Сравнение типов обеспечивают перегруженные операторы == и !=. Функция beforeO возвращает истину, если вызывающий объект в порядке сортировки расположен раньше объекта, заданного в качестве параметра. (Эта функция обгчно предназначена только для внутреннего использования. Ее возвращаемое значение вряд ли может пригодиться при операциях с наследованием или иерархиями классов.) Функция пате() возвращает указатель на имя типа.



В следующей программе демонстрируется использование оператора typeid. Сначала с помощью этого оператора мы получаем информацию об одном из встроенных типов данных С++ - типе int. Затем оператор typeid дает нам возможность вывести на экран типы объектов, на которые указывает указатель р, являющийся указателем базового класса BaseClass.

Пример ьзования оператора typeid г

finclude <iostream>

finclude <typeinfo> . i. - ..

using namespace std; i.!,4i; .-

Хотя оператор eid позволяет получать типы разнхх объектов, наиболее полезен он будет, если в качестве его аргумента задать указатель полиморфного базового класса. В этом случае оператор автоматически возвращает тип реального объекта, на который указывает указатель. Этим объектом может быть как объект базового класса, так и объект любого класса, производного

от этого базового. (Вспомните, указатель базового класса может указывать

либо на объект базового класса, либо на объект любого класса, производного от этого базового.) Таким образом, с помощью оператора typeid во время выполнения программы можно определить тип объекта, на который указывает указатель базового класса. То же самое относится и к ссылкам. Когда в качестве аргумента оператора typeid указана ссылка на объект полиморфного класса, оператор возвращает тип реального объекта, на который имеется ссглка. Этим объектом, так же как и в случае с указателем, может быть объект производного класса. Когда оператор typeid применяют к неполиморфному классу, получают указатель или ссылку базового типа.

Ниже представлена вторая форма оператора typeid, в которой в качестве аргумента указывают имя типа:

typeid (j!o ! na)

Обычно с помощью данной формы оператора typeid получают объект типа type info, который можно использовать в инструкции сравнения типов.

Поскольку оператор typeid чаще всего применяют к разыменованному указателю (т. е. указателю, к которому уже был применен оператор *), для обработки положения, когда разыменованный указатель равен нулю, бьша придумана специальная исключительная ситуация которую в

этом случае возбуждает оператор typeid.

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

она позволяет в самых разнообразных ситуациях определять типы обрабатываемых объектов.



1 ... 114 115 116 [ 117 ] 118 119 120 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика