Динамічна ідентифікація типу
Динамічна ідентифікація типу (англ. Run-Time Type Identificator, RTTI) — механізм мов програмування, що дозволяє ідентифікувати тип об'єкта у процесі виконання програми.
Функціональність у С++
Був доданий у мову С++ для підтримки об'єктно-орієнтованого програмування та динамічного поліморфізму. Додаткові оператори приведення типів забезпечують безпечніший спосіб приведення. Цей механізм не був включений в початкову версію мови С++. RTTI був доданий згодом, у зв'язку з існуванням низки однотипних механізмів, що часто призводило до конфлікту версій бібліотек.
Для ідентифікації типу в С++ використовується оператор typeid визначений в заголовковому файлі <typeinfo>, або оператор dynamic_cast.
Синтаксис оператора typeid
Найчастіше він використовується так:
typeid (object);
Тут object – об'єкт, тип якого ми хочемо ідентифікувати. Оператор typeid повертає вказівник на об'єкт типу type_info, який описує тип об'єкта. Клас type_info містить такі функції-члени:
bool operator == (const type_info& ob);
bool operator != (const type_info& ob);
bool before(const type_info& ob);
const char* name();
Перевантажені оператори “!=” і “==” дозволяють порівнювати типи. Оператор before повертає значення true, коли викликаючий об'єкт є предком об'єкта, використаного як параметр. Функція name() повертає вказівник на назву даного типу.
Синтаксис оператора dynamic_cast
Основна стаття: Dynamic cast
dynamic_cast<newType> (expression);
newType - вказівник, або посилання на існуючий тип, або void-вказівник.
expression - операнд, який приводиться до типу newType
Приклад
class A {virtual void f();}; class B {virtual void f();};
void f() { A* pa = new A; B* pb = new B; void* pv = dynamic_cast<void*>(pa); // pv now points to an object of type A pv = dynamic_cast<void*>(pb); // pv now points to an object of type B }
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 чи аналог) і повертає скаляр, який зберігає ім'я класу.
Джерела
- Г. Шилдт : Полный справочник по C++, 4-е издание = C++: The Complete Reference, 4th Edition — М.: «Вильямс», 2011. — 800 с. — ISBN 978-5-8459-0489-8.
- Подбельский В. В. 12.6 Динамическая идентификация типов (RTTI) // Язык Си++ / Рец. Дадаев Ю. Г.. — 4-е изд. — М.: Финансы и статистика, 2003. — С. 263—280. — 560 с. — ISBN 5-279-02204-7, УДК 004.438Си(075.8) ББК 32.973.26-018 1я173