ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 11) онлайн

Оператор typeid

Иногда требуется более полная информация об объекте, нежели простая вери-

фикация его классовой принадлежности. Можно узнать, например, имя типа не-

опознанного объекта, используя оператор typeid. Рассмотрим в связи с этим про-

грамму TYPEID.

Листинг 11.25. Программа TYPEID

// typeid.cpp

// демонстрация функции typeid()

// RTTI должен быть активизирован

#include <iostream>

#include <typeinfo>        // для typeid()

using namespace std;

///////////////////////////////////////////////////////////

class Base

  {

  virtual void virtFunc()  // для нужд typeid

    {  }

  };

class Derv1 : public Base

  { };

class Derv2 : public Base

  { };

///////////////////////////////////////////////////////////

void displayName(Base* pB)

  {

  cout << "указатель на объект класса "; // вывести имя класса

  cout << typeid(*pB).name() << endl;    //на который

                                         //указывает pB

  }

//---------------------------------------------------------

int main()

{

  Base* pBase = new Derv1;

  displayName(pBase);  //"указатель на объект класса Derv1"

  pBase = new Derv2;

  displayName(pBase);  //" указатель на объект класса Derv2"

  return 0;

}

 

В этом примере функция displayName() отображает имя класса переданного

ей объекта. Для этого она использует переменную name класса type_info наряду

с оператором typeid. В main() мы передаем этой функции два объекта классов

Dervl и Derv2 соответственно. На экране видим следующее:

указатель на объект класса Dervl

указатель на объект класса Derv2

Используя typeid, кроме имени можно получить и некоторую другую ин-

формацию о классе. Например, используя перегружаемую операцию ==, можно

 

осуществить проверку на равенство классов. Пример этого мы покажем в про-

грамме EMPL_IO в главе 12 «Потоки и файлы». Несмотря на то что в этом разде-

ле в примерах использовались указатели, dynamic_cast и typeid работают одина-

ково хорошо со ссылками.

 

32