Динамическое определение типа
Механизм идентификации типа во время выполнения программы (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++