Динамічна ідентифікація типу (англ. 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++ [ 25 травня 2014 у Wayback Machine.], 4-е издание = C++: The Complete Reference, 4th Edition — М.: «Вильямс», 2011. — 800 с. — .
- Подбельский В. В. 12.6 Динамическая идентификация типов (RTTI) // Язык Си++ / Рец. Дадаев Ю. Г.. — 4-е изд. — М.: Финансы и статистика, 2003. — С. 263—280. — 560 с. — , УДК 004.438Си(075.8) ББК 32.973.26-018 1я173
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Dinamichna identifikaciya tipu angl Run Time Type Identificator RTTI mehanizm mov programuvannya sho dozvolyaye identifikuvati tip ob yekta u procesi vikonannya programi Funkcionalnist u S Buv dodanij u movu S dlya pidtrimki ob yektno oriyentovanogo programuvannya ta dinamichnogo polimorfizmu Dodatkovi operatori privedennya tipiv zabezpechuyut bezpechnishij sposib privedennya Cej mehanizm ne buv vklyuchenij v pochatkovu versiyu movi S RTTI buv dodanij zgodom u zv yazku z isnuvannyam nizki odnotipnih mehanizmiv sho chasto prizvodilo do konfliktu versij bibliotek Dlya identifikaciyi tipu v S vikoristovuyetsya operator typeid viznachenij v zagolovkovomu fajli lt typeinfo gt abo operator dynamic cast Sintaksis operatora typeid Najchastishe vin vikoristovuyetsya tak typeid object Tut object ob yekt tip yakogo mi hochemo identifikuvati Operator typeid povertaye vkazivnik na ob yekt tipu type info yakij opisuye tip ob yekta Klas type info mistit taki funkciyi chleni bool operator const type info amp ob bool operator const type info amp ob bool before const type info amp ob const char name Perevantazheni operatori i dozvolyayut porivnyuvati tipi Operator before povertaye znachennya true koli viklikayuchij ob yekt ye predkom ob yekta vikoristanogo yak parametr Funkciya name povertaye vkazivnik na nazvu danogo tipu Sintaksis operatora dynamic cast Osnovna stattya Dynamic cast dynamic cast lt newType gt expression newType vkazivnik abo posilannya na isnuyuchij tip abo void vkazivnik expression operand yakij privoditsya do tipu newType Priklad class A virtual void f class B virtual void f void f A pa new A B pb new B void pv dynamic cast lt void gt pa pv now points to an object of type A pv dynamic cast lt void gt pb pv now points to an object of type B DelphiKompilyator Delphi zberigaye v vihidnomu fajli programi informaciyu pro vsi klasi yaki vikoristovuyutsya v nij Pri stvorenni bud yakogo ob yekta v pam yati pered nim stvoryuyetsya zagolovok v yakomu ye vkazivnik na klas cogo ob yekta Operator is dozvolyaye pereviriti chi ye ob yekt abo tip pohidnim vid pevnogo tipu a operator as ye analogom dynamic cast v C Zagolovki ob yektiv takozh neyavno vikoristovuyutsya dlya avtomatichnogo keruvannya pam yattyu C V C dlya viznachennya tipu ob yekta pid chas vikonannya vikoristovuyetsya metod GetType a takozh klyuchovi slova is i as yaki ye analogami dlya typeid i dynamic cast v C vidpovidno JavaV Java tip ob yekta mozhe buti oderzhanim za dopomogoyu metodu getClass ogoloshenogo v klasi java lang Object i tomu realizovanogo kozhnim klasom Dlya perevirki nalezhnosti ob yekta pevnomu tipu vikoristovuyetsya operator instanceof analogom dynamic cast z C ye operator privedennya tipu yakij u vipadku nevidpovidnosti tipiv vikidaye vinyatok ClassCastException Na rivni bajt kodu vikliku metodu klas zapisuyetsya yak i viklik bud yakogo inshogo metodu za dopomogoyu opkodu invokevirtual Dlya perevirki mozhlivosti privedennya ob yekta do tipu vikoristovuyutsya opkodi instanceof i checkcast PerlV Perl tip ob yekta mozhe buti identifikovanim za dopomogoyu funkciyi blessed yaka ye chastinoyu CPAN modulya Scalar Util Funkciya prijmaye vkazivnik na ob yekt blessed hash chi analog i povertaye skalyar yakij zberigaye im ya klasu DzherelaG Shildt Polnyj spravochnik po C 25 travnya 2014 u Wayback Machine 4 e izdanie C The Complete Reference 4th Edition M Vilyams 2011 800 s ISBN 978 5 8459 0489 8 Podbelskij V V 12 6 Dinamicheskaya identifikaciya tipov RTTI Yazyk Si Rec Dadaev Yu G 4 e izd M Finansy i statistika 2003 S 263 280 560 s ISBN 5 279 02204 7 UDK 004 438Si 075 8 BBK 32 973 26 018 1ya173