Динамічна ідентифікація типу

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Динамічна ідентифікація типу (англ. 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