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

Динамічна ідентифікація типу (англ. 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 зберігає в вихідному файлі програми інформацію про всі класи, які використовуються в ній. При створенні будь-якого об'єкта в пам'яті перед ним створюється заголовок, в якому є вказівник на клас цього об'єкта. Оператор is дозволяє перевірити, чи є об'єкт або тип похідним від певного типу, а оператор as є аналогом dynamic_cast в C++.

Заголовки об'єктів — також неявно — використовуються для автоматичного керування пам'яттю.

В C# для визначення типу об'єкта під час виконання використовується метод GetType, а також ключові слова is і as, які є аналогами для typeid і dynamic_cast в C++ відповідно.

В Java тип об'єкта може бути одержаним за допомогою методу getClass(), оголошеного в класі java.lang.Object і тому реалізованого кожним класом. Для перевірки належності об'єкта певному типу використовується оператор instanceof, аналогом dynamic_cast з C++ є оператор приведення типу, який у випадку невідповідності типів викидає виняток ClassCastException.

На рівні байт-коду виклику методу клас записується, як і виклик будь-якого іншого методу, за допомогою опкоду invokevirtual. Для перевірки можливості приведення об'єкта до типу використовуються опкоди instanceof и checkcast.

В Perl тип об'єкта може бути ідентифікованим за допомогою функції blessed(), яка є частиною CPAN-модуля Scalar::Util. Функція приймає вказівник на об'єкт (blessed hash чи аналог) і повертає скаляр, який зберігає ім'я класу.

Джерела

[ред. | ред. код]