Динамическое определение типа

Механизм идентификации типа во время выполнения программы (RTTI) позволяет определять, на какой тип в текущий момент времени ссылается указатель, а также сравнивать типы объектов. Для доступа к RTTI в стандарт языка введена операция typeid и класс type_info. В старых версиях компиляторов этот класс может называться Typeinfo или typeinfo.

Формат операции typeid:

typeid (тип)

typeid (выражение)

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

Когда операнд представляет собой указатель или ссылку на полиморфный тип, результатом является динамическая информация о типе (т.е. объект type_info содержит информацию о типе объекта, на который в данный момент ссылается указатель).

Если операндом является выражение, представляющее собой ссылку на неполиморфный тип, объект type_info содержит информацию о типе выражения, а не о типе объекта, на который оно ссылается.

Операцию typeid можно использовать как с основными, так и с производными типами данных.

Класс type_info описан в заголовочном файле typeinfo.h следующим образом:

class type_info{

public:

virtual ~ type_info( );

bool operator == (const type_info& rhs) const;

bool operator != (const type_info& rhs) const;

bool before (const type_info& rhs) const;

const char* name ( ) const;

private:

type_info (const type_info& rhs);

type_info& operator = (const type_info& rhs);

};

Метод name возвращает указатель на строку, представляющую имя типа, описываемого объектом типа type_info.

Виртуальный деструктор делает класс type_info полиморфным.

Конструктор копирования и операция присваивания объявлены как private, чтобы исключить возможность случайного копирования и присваивания объектов класса.

Операции == и ! = позволяют сравнивать два объекта на равенство и неравенство, а функция before выполняет побуквенное сравнение имен двух типов. Для сравнения используется конструкция вида:

typeid(Tl).before(typeid(T2))

Если имя типа Т1 лексикографически предшествует имени Т2, результат будет истинным.

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

Пример:

#include <typeinfo.h>

class В{ ...

public: virtual ~В(){ ...};

};

class С: public В{ ...

public: virtual void some_method( ){ ... };

};

void demo (B* р){

if (typeid(*p) == typeid(C))

dynamic_cast<C*>(p)->some_method();

}

int main(){

C* с = new C;

demo(c);

return 0;

}

Информацию о типе полезно использовать и в диагностических целях:

void print_type (some_obj *р){

cout << type_id(*p).name();

}

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

 


Литература

 

Основные источники:

1. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2006. – 464 с.:ил.

2. Липпман С.Б. С++ для начинающих. – 4-е изд. – М.: Издательский дом «Вильямс», 2005. – 890 с.: ил.

3. Подбельский В.В., Фомин С.С. Программирование на языке Си: Учеб.пособие. – 2-е доп. изд. – М.: Финансы и статистика, 2005. – 600 с.: ил.

4. Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. – СПб.: Питер, 2007. – 265 с.: ил.

5. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование: Практикум. – СПб.: Питер, 2007. – 239 с.: ил.

 

Дополнительные источники:

1. Архангельский А.Я. Программирование в С++ Builder 6. – 7-е изд. – М.: БИНОМ, 2010. – 1152 с., ил.

2. Страуструп Б. Язык программирования С++. – М.: БИНОМ, 2011. – 371 с.: ил.

3. Ахо А., Хопкфорд Д., Ульман Д. Структуры данных и алгоритмы.: Пер. с англ. – М.: Издательский дом «Вильямс», 2010. – 400 с.: ил.

4. Седжвик Р. Фундаментальные алгоритмы на С++. Анализ/Структуры даннных/Сортировка/Поиск. Пер. с англ. – К.: Издательство «ДиаСофт», 2002. – 688 с.: ил.

5. Динман М.И. С++. Освой на примерах. – СПб.: БХВ-Петербург, 2006. – 384 с.: ил.

6. Культин Н.Б. С/С++ в задачах и примерах. – СПб.: БХВ-Петербург, 2006. – 288 с.: ил.

 

Электронные учебные пособия:

Справочник советов и примеров по C++Builder.

 

Интернет-ресурсы:

http://citforum.ru - Справочная библиотека по Borland C++