Выбрать главу

/* Применение оператора typeid к ссылочному параметру.

*/

#include <iostream>

#include <typeinfo>

using namespace std;

class Base {

 virtual void f() {}; // делаем класс Base полиморфным

 // . . .

};

class Derived1: public Base {

 // . . .

};

class Derived2: public Base {

 // . . .

};

/* Демонстрируем применение оператора typeid к ссылочному параметру.

*/

void WhatType(Base &ob)

{

 cout << "Параметр ob ссылается на объект типа ";

 cout << typeid(ob).name() << endl;

}

int main()

{

 int i;

 Base baseob;

 Derived1 obi;

 Derived2 ob2;

 WhatType(baseob);

 WhatType(ob1);

 WhatType(ob2);

 return 0;

}

Эта программа генерирует такие результаты.

Параметр ob ссылается на объект типа Base

Параметр ob ссылается на объект типа Derived1

Параметр ob ссылается на объект типа Derived2

Существует еще одна версия применения оператора typeid, которая в качестве аргумента принимает имя типа. Формат ее таков.

tуре id(имя_типа)

Например, следующая инструкция совершенно допустима.

cout << typeid(int).name();

Назначение этой версии оператора typeid — получить объект типа type_info (который описывает заданный тип данных), чтобы его можно было использовать в инструкции сравнения типов.

Пример RTTI-приложения

В следующей программе показано, насколько полезной может быть средство динамической идентификации типов (RTTI). Здесь используется модифицированная версия иерархии классов геометрических фигур из главы 15, которая вычисляет площадь круга, треугольника и прямоугольника. В данной программе определена функция fасtorу(), предназначенная для создания экземпляра круга, треугольника или прямоугольника. Эта функция возвращает указатель на созданный объект. (Функция, которая генерирует объекты, иногда называется фабрикой объектов.) Конкретный тип создаваемого объекта определяется в результате обращения к функции rand() С++-генератора случайных чисел. Таким образом, мы не можем знать заранее, объект какого типа будет сгенерирован. Программа создает десять объектов и подсчитывает количество созданных фигур каждого типа. Поскольку при вызове функции fасtorу() может быть сгенерирована фигура любого типа, для определения типа реально созданного объекта в программе используется оператор typeid.

/* Демонстрация использования средства динамической идентификации типов.

*/

#include <iostream>

#include <cstdlib>

using namespace std;

class figure {

 protected:

  double x, y;

 public:

  figure(double i, double j) {

   x = i;

   У = j;

  }

  virtual double area() = 0;

};

class triangle : public figure {

 public:

  triangle(double i, double j) : figure(i, j) {}

  double area() {

   return x * 0.5 * y;

  }

};

class rectangle : public figure {

 public:

  rectangle(double i, double j) : figure (i, j) {}

  double area() { return x * y;}

};

class circle : public figure {

 public: