- Динамическая идентификация типа данных
-
Не следует путать с динамической типизацией.
Динамическая идентификация типа данных (англ. Run-time type information, Run-time type identification, RTTI) — механизм в некоторых языках программирования, который позволяет определить тип данных переменной или объекта во время выполнения программы.
Содержание
Реализация
Существует множество реализаций такого механизма, но наиболее распространенными являются:
- таблица указателей на объекты;
- хранение информации об объекте в памяти вместе с ним.
Таким образом, операция определения типа сводится либо к поиску в таблице, либо к просмотру нескольких байт до адреса, на который указывает указатель на объект. У каждого способа есть свои преимущества и недостатки[уточнить].
C++
В C++ для динамической идентификации типов[1] применяются операторы
dynamic_cast
иtypeid
(определён в файле typeinfo.h), для использования которых информацию о типах во время выполнения обычно необходимо добавить через опции компилятора при компиляции модуля.Оператор
dynamic_cast
пытается выполнить приведение к указанному типу с проверкой. Целевой тип операции должен быть типом указателя, ссылки илиvoid*
.- Если целевой тип — тип указателя, то аргументом должен быть указатель на объект класса.
- Если целевой тип — ссылка, то аргумент должен также быть соответствующей ссылкой.
- Если целевым типом является
void*
, то аргумент также должен быть указателем, а результатом операции будет указатель, с помощью которого можно обратиться к любому элементу «самого производного» класса иерархии, который сам не может быть базовым ни для какого другого класса.
Оператор
typeid
[2] возвращает ссылку на структуруtype_info
, которая содержит поля, позволяющие получить информацию о типе.Delphi
Компилятор Delphi сохраняет в исполняемом файле программы информацию обо всех классах, используемых в ней. При создании любого объекта в памяти перед ним (по отрицательным смещениям) располагается заголовок, в котором есть в том числе ссылка на структуру-описатель класса этого объекта. Встроенные в язык функции работают с этой информацией прозрачно для программиста. Оператор
is
позволяет проверить, является ли объект или тип наследником определённого типа, а операторas
является аналогомdynamic_cast
в C++.Заголовки объектов — также неявно — используются для автоматического управления памятью.
C#
В C# для определения типа объекта во время исполнения используется метод
GetType
, а также ключевые словаis
иas
, которые являются аналогами дляtypeid
иdynamic_cast
в C++ соответственно.Java
В Java тип объекта может быть получен при помощи метода
getClass()
, объявленного в классеjava.lang.Object
и потому реализуемого каждым классом. Для проверки принадлежности объекта определенному типу используется операторinstanceof
, аналогомdynamic_cast
из C++ является оператор приведения типа, который в случае несоответствия типов выбрасывает исключениеClassCastException
.На уровне байт-кода вызов метода класс записывается, как и вызов всякого другого метода, при помощи опкода invokevirtual. Для проверки приводимости объекта к типу используются опкоды instanceof и checkcast.
Perl
В Perl тип объекта может быть определен с помощью функции blessed(), являющуюся частью CPAN-модуля Scalar::Util. Функция принимает указатель на объект (blessed hash или аналог) и возвращает скаляр, содержащий имя класса.
См. также
Примечания
- ↑ Идентификация типов во время выполнения
- ↑ Подбельский В. В. 12.6 Динамическая идентификация типов (RTTI) // Язык Си++ / Рец. Дадаев Ю. Г.. — 4-е изд. — М.: Финансы и статистика, 2003. — С. 263—280. — 560 с. — ISBN 5-279-02204-7, УДК 004.438Си(075.8) ББК 32.973.26-018 1я173
Для улучшения этой статьи желательно?: - Викифицировать статью.
- Найти и оформить в виде сносок ссылки на авторитетные источники, подтверждающие написанное.
Категории:- Концепции языков программирования
- Типы данных
- Стандартные библиотеки
Wikimedia Foundation. 2010.