Глава 23. Динамическая идентификация типов_______________________645
худшем случае, если другой разработчик вообще не использует метод идентификации классов?
Ясно, что, в конце концов проблема требует стандартизации. Еии вы следуете всем правилам, если вы достаточно удачливы, чтобы избежать совпадения идентификаторов и если у вас нет необходимости интегрировать ваши разработки с другими библиотеками классов, подход с функцией isA(), вероятно, вам подойдет. С другой стороны, такое количество "если' не может не вызывать беспокойства. Строить свои разработки на такой шаткой основе очень ненадежно.
Решение проблемы: dynamic_cast
Система динамической идентификации типов компилятора Borland предлагает (среди многого другого) метод, подобный. isA(), но не требующий договоренностей разработчиков или встраивания в ваши библиотеки классов сложных механизмов обработки ошибок.
Основы операции dynamic_ccist
Одним из способов, которым RTTI улучшает подход, реализованный с помощью функции isA(), является введение новой операции приведения типов — dynamic_cast. Операция dynamic_cast прежде всего разработана для обеспечения возможности безопасно перемещать указатель вверх и вниз по иерархии классов. Ключевым в этой фразе является слово безопасно, поскольку просто перемещать указатели по иерархии классов в C++ можно и с помощью обычного приведения типов.
Операция dynamic_cast имеет следующий синтаксис:
dynamic_cast<r*>(ptr) ,
Здесь т означает допустимый тип C++, а ptr — исходный указатель. Операция возвращает указатель типа г, если ptr указывает на объект этого типа. Если ptr — это указатель другого типа, dynamic_cast возвращает NULL.
При использовании операции dynamic_cast эту особенность следует иметь в виду. Кроме того, как и другие конструкции RTTI, операция dynamic_cast предназначена для использования только с полиморфными классами. Полиморфным классом (polimorphic class) называется класс, который содержит, по крайней мере, одну виртуальную (или чистую виртуальную) функцию. Кроме того, классы, которые наследуют виртуальные функции от классов более высокого уровня, тоже могут использовать RTTI.
Замечание
(Поскольку целочисленные типы не являются полиморфными, то для этих типов в компилятор не поддерживает RTTI. Использовать RTTI могут только