В следующей программе показано, насколько полезной может быть средство динамической идентификации типов (RTTI). Здесь используется модифицированная версия иерархии классов геометрических фигур из главы 15, которая вычисляет площадь круга, треугольника и прямоугольника. В данной программе определена функция
/* Демонстрация использования средства динамической идентификации типов.
*/
#include
#include
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:
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
Сгенерированы такие объекты: