circle(double i, double j=0) : figure(i, j) {}
double area() {return 3.14 * x * x;}
};
// Фабрика объектов класса figure.
figure *factory()
{
switch(rand() % 3 ) {
case 0: return new circle (10.0);
case 1: return new triangle (10.1, 5.3);
case 2: return new rectangle (4.3, 5.7);
}
return 0;
}
int main()
{
figure *p; // указатель на базовый класс
int i;
int t=0, r=0, c=0;
// генерируем и подсчитываем объекты
for(i=0; i<10; i++) {
p = factory(); // генерируем объект
cout << "Объект имеет тип " << typeid(*р).name();
cout << ". ";
// учитываем этот объект
if(typeid(*р) == typeid(triangle)) t++;
if(typeid(*p) == typeid(rectangle)) r++;
if(typeid(*p) == typeid(circle)) c++;
// отображаем площадь фигуры
cout << "Площадь равна " << p->area() << endl;
}
cout << endl;
cout << "Сгенерированы такие объекты:\n";
cout << " треугольников: " << t << endl;
cout << " прямоугольников: " << r << endl;
cout << " кругов: " << с << endl;
return 0;
}
Возможный результат выполнения этой программы таков.
Объект имеет тип class rectangle. Площадь равна 24.51
Объект имеет тип class rectangle. Площадь равна 24.51
Объект имеет тип class triangle. Площадь равна 26.765
Объект имеет тип class triangle. Площадь равна 26.765
Объект имеет тип class rectangle. Площадь равна 24.51
Объект имеет тип class triangle. Площадь равна 26.765
Объект имеет тип class circle. Площадь равна 314
Объект имеет тип class circle. Площадь равна 314
Объект имеет тип class triangle. Площадь равна 26.765
Объект имеет тип class rectangle. Площадь равна 24.51
Сгенерированы такие объекты:
треугольников: 4
прямоугольников: 4
кругов: 2
Оператор typeid можно применить и к шаблонным классам. Тип объекта, который является экземпляром шаблонного класса, определяется частично на основании того, какие именно данные используются для его обобщенных данных при реализации объекта. Таким образом, два экземпляра одного и того же шаблонного класса, которые создаются с использованием различных данных, имеют различный тип. Рассмотрим простой пример.
/* Использование оператора typeid с шаблонными классами.
*/
#include <iostream>
using namespace std;
template <class T>
class myclass {
T a;
public:
myclass(T i) { a = i; }
// . . .
};
int main()
{
myclass<int> o1(10), o2(9);
myclass<double> o3(7.2);
cout << "Объект o1 имеет тип ";
cout << typeid(o1).name() << endl;
cout << "Объект o2 имеет тип ";
cout << typeid(o2).name() << endl;
cout << "Объект o3 имеет тип ";
cout << typeid(o3).name() << endl;
cout << endl;
if(typeid(o1) == typeid(o2))
cout << "Объекты o1 и o2 имеют одинаковый тип.\n";
if(typeid(o1) == typeid(o3)) cout << "Ошибка\n";
else cout << "Объекты o1 и o3 имеют разные типы.\n";