Ідентифікація типу під час виконання (rtti), програмування на c і ​​c

Використовуючи ідентифікацію типу часу виконання (run-time type identification - RTTI) можна визначити тип об'єкта під час виконання програми. Для цього використовується функція typeid. Для використання цієї функції необхідно включити заголовки typeinfo.h. Загальна форма запису функції typeid має наступний вигляд:

Тут об'єкт є об'єктом, чий тип потрібно визначити. Функція typeid повертає посилання на об'єкт типу typeinfo, який описує тип об'єкта об'єкт. (У проекті стандарту З ++ цей тип називається type_info.) Клас typeinfo визначає наступні публічні члени:

bool operator == (const typeinfo ob) const;
bool operator! = (const typeinfo ob) const;
bool before (const typeinfo ob) const;
const char * name () const;

Перевантажені оператори == і! = Забезпечують порівняння типів. Функція before () повертає істину, якщо викликається об'єкт коштує вище в ієрархії об'єктів, ніж об'єкт, який використовується в якості параметра. Функція before () призначена здебільшого для внутрішнього вико-вання. Що повертається нею значення не має нічого спільного з ієрархією класів або успадкування третьому. Функція name () повертає покажчик на ім'я типу.

Коли функція typeid застосовується до покажчика на базовий клас поліморфного класу, вона автоматично повертає тип об'єкта, на який вказує покажчик, в тому числі будь-який клас, виведений з базового класу. (Як уже говорилося, поліморфним класом називається клас, що містить хоча б одну віртуальну функцію.)

ПАМ'ЯТКА: Покажчик обов'язково повинен бути разименован. Слід також встановити режим підтримки RTTI в опціях компілятора.

Наступна програма демонструє використання функції typeid

// приклад використання typeid
#include
#include
class BaseClass int a, b;
virtual void f () <>; // BaseClass поліморфний
>;
class Derived1: public BaseClass int i, j;
>;
class Derived2: public BaseClass int k;
>;
int main ()
int i;
BaseClass * p, baseob;
Derived1 ob1;
Derived2 ob2;
// спочатку виводиться ім'я вбудованого типу
cout <<"Typeid of i is ";
cout < // демонстрація typeid з поліморфними типами
p = &baseob;
cout <<"p is pointing to an object of type ";
cout < p = &ob1;
cout <<"p is pointing to an object of type ";
cout < p = &ob2;
cout <<"p is pointing to an object of type ";
cout < return 0;
>

Програма видасть наступний результат на екран:

Typeid of i is int
p is pointing to an object of type BaseClass
p is pointing to an object of type Derived1
p is pointing to an object of type Derived2

RTTI не є тим засобом, який використовується будь-якої програмою. Однак при роботі з поліморфними типами вона дозволяє знати тип об'єкта в будь-якій ситуації.

Схожі статті