Язык программирования C++. Вводный курс


Класс type_info - часть 2


#include <typeinfo>

int main() {

   employee *pe = new manager;

 

   // ïå÷àòàåò: "manager"

   cout << typeid( *pe ).name() << endl;

}

Для работы с функцией-членом name()

нужно включить заголовочный файл <typeinfo>.

Имя типа – это единственная информация, которая гарантированно возвращается всеми реализациями C++, при этом используется функция-член name() класса type_info. В начале этого раздела упоминалось, что поддержка RTTI зависит от реализации и иногда в классе type_info

бывают дополнительные функции-члены. Чтобы узнать, каким образом обеспечивается поддержка RTTI в вашем компиляторе, обратитесь к справочному руководству по нему. Кроме того, можно получить любую информацию, которую компилятор знает о типе, например:

·         список функций-членов класса;

·         способ размещения объекта в памяти, т.е. взаимное расположение подобъектов базового и производных классов.

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

есть виртуальный деструктор, то оператор dynamic_cast позволяет выяснить, имеется ли некоторое конкретное расширение RTTI. Предположим, что некоторый компилятор предоставляет расширенную поддержку RTTI посредством класса extended_type_info, производного от type_info. С помощью оператора dynamic_cast

программа может узнать, принадлежит ли объект типа type_info, возвращенный оператором typeid, к типу extended_type_info. Если да, то пользоваться расширенной поддержкой RTTI разрешено.

#include <typeinfo>

 

// Файл typeinfo содержит определение типа extended_type_info

 

void func( employee* p )

{

   // понижающее приведение типа type_info* к extended_type_info*

   if ( eti *eti_p = dynamic_cast<eti *>( &typeid( *p ) ) )

   {

      // если dynamic_cast завершается успешно,

      // можно пользоваться информацией из extended_type_info через eti_p

   }

   else

   {

      // если dynamic_cast завершается неудачно,

      // можно пользоваться только стандартным type_info

   }

<


Начало  Назад  Вперед



Книжный магазин