Кіріспе
Компьютерлік бағдарламалауда, орындалу уақытында тип туралы ақпарат немесе орындалу уақытында типті анықтау (RTTI) – кейбір бағдарламалау тілдерінің (мысалы, C++, Object Pascal және Ada) мүмкіндігі, ол объектінің дерек типі туралы ақпаратты орындалу кезінде көрсетеді. Орындалу уақытында тип туралы ақпарат барлық типтер үшін немесе тек қана оны тікелей қолдайтын типтер үшін ғана қолжетімді болуы мүмкін (Ada-дағыдай). Орындалу уақытында тип туралы ақпарат – типтік интроспекция деп аталатын көбірек жалпы ұғымның бір саласы. Алғашқы C++ дизайнында Бьярн Строструп орындалу уақытында тип туралы ақпаратты қоспаған, себебі ол бұл механизмнің көбінесе дұрыс пайдаланбау мүмкіндігі бар деп ойлаған.
In computer programming, run time type information or run time type identification (RTTI) is a feature of some programming languages (such as C++, Object Pascal, and Ada) that exposes information about an object's data type at runtime. Run time type information may be available for all types or only to types that explicitly have it (as is the case with Ada). Run time type information is a specialization of a more general concept called type introspection. In the original C++ design, Bjarne Stroustrup did not include run time type information, because he thought this mechanism was often misused.
Шолу
C++ тілінде RTTI-ны динамикалық `cast<>` операторы арқылы қауіпсіз типтік түрлендірулерді орындауға және `typeid` операторы мен `std::type_info` класын пайдалана отырып, орындалу кезінде типтік ақпаратты манипуляциялауға болады. Object Pascal-да RTTI-ді `as` операторымен қауіпсіз типтік түрлендірулерді орындау, `is` операторымен объектінің қай классқа жататынын тексеру және RTTI модуліндегі кластарды (мысалы, `TRttiContext`, `TRttiInstanceType` және т.б.) пайдалана отырып, орындалу кезінде типтік ақпаратты өңдеу үшін қолдануға болады. Ada-да таңбаланған типтердегі объектілер де типтік белгіні сақтайды, бұл орындалу кезінде осы объектінің типін анықтауға мүмкіндік береді. `in` операторы объектінің белгілі бір типке жататындығын тексеруге және оны қауіпсіз түрлендіруге болады. RTTI тек полиморфты класс үшін қолжетімді, яғни оларда кем дегенде бір виртуалды әдіс болуы керек. Іс жүзінде бұл шектеу емес, себебі базалық класс виртуалды деструкторға ие болуы керек, бұл базалық көрсеткіштен жойылған жағдайда туынды класс объектілерінің дұрыс тазалануын қамтамасыз етеді. Кейбір компиляторларда RTTI-ны өшіруге арналған опциялар бар. Бұл опцияларды пайдалану қосымшаның жалпы көлемін азайтуы мүмкін, бұл жады шектеулі жүйелерге бағытталғанда өте пайдалы.
C++ typeid
Typeid резервтелген сөзі (кілт сөз) орындалу кезінде объектінің класын анықтау үшін қолданылады. Ол std::type_info объектісіне сілтеме қайтарады, ол бағдарлама аяқталғанға дейін сақталады. Полиморфты емес жағдайда typeid-ты пайдалану, тек кластық ақпарат қажет болғанда dynamic_cast<класс түрі>-нен көбінесе артықшылыққа ие, себебі typeid әрқашан тұрақты уақытта орындалады, ал dynamic_cast аргументінің кластық мұрагерлік желісін орындау кезінде қарап шығуы мүмкін. Қайтарылатын объектінің кейбір аспектілері, мысалы std::type_info::name, жүйеленуге байланысты болады және олардың компиляторлар арасында сәйкес келетініне сенуге болмайды. typeid өрнегі null көрсеткіш бойынша * операторын қолдану нәтижесінде болғанда std::bad_typeid класының нысандары жосылады. Басқа null сілтеме аргументтері үшін ерекшелік жосылатыны жүйеленуге байланысты. Яғни, ерекшелік кепілді болуы үшін, өрнек typeid(*p) түрінде болуы керек, мұнда p – null көрсеткішке әкелетін кез келген өрнек.
C++ dynamic_cast және Java cast
C++-тағы динамикалық түрге келтіру операторы сынып иерархиясындағы нақтырақ түрге сілтеме немесе көрсеткішті түрлендіру үшін қолданылады. Статикалық түрге келтіруден айырмашылығы, динамикалық түрге келтірудің мақсаты классқа сілтеме немесе көрсеткіш болуы керек. Статикалық түрге келтіру және C стиліндегі түрге келтіруден (мұнда типті тексеру компиляция кезінде жүзеге асырылады) айырмашылығы, типтік қауіпсіздік тексерусі орындалу кезінде жасалады. Егер типтер үйлесімсіз болса, ерекшелік туындайды (сілтемелермен жұмыс істегенде) немесе нөлдік көрсеткіш қайтарылады (көрсеткіштермен жұмыс істегенде). Java-дағы түрге келтіру ұқсас жұмыс істейді; егер түрлендіріліп жатқан объект мақсатты типтің мысалы болмаса және оны тілде анықталған әдіс арқылы өзгерту мүмкін болмаса, онда java.lang.ClassCastException мысалы туындайды.