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
Динамическая идентификация типов используется не в каждой программе. Но при работе с полиморфными типами это средство позволяет узнать тип объекта, обрабатываемого в любой произвольный момент времени.
Операторы приведения типов В C++ определено пять операторов приведения типов. Первый оператор (он описан выше в этой книге), применяемый в обычном (традиционном) стиле, был с самого начала встроен в C++. Остальные четыре (dynamic_cast
, const_cast, reinterpret_cast и static_cast) были добавлены в язык всего несколько лет назад. Эти операторы предоставляют дополнительные "рычаги управления" характером выполнения операций приведения типа. Рассмотрим каждый из них в отдельности.Оператор dynamic_cast
Оператор dynamic_cast выполняет операцию приведения полиморфных типов во время выполнения программы.
Возможно, самым важным из новых операторов является оператор динамического приведения типов dynamic_cast
. Во время выполнения программы он проверяет обоснованность предлагаемой операции. Если в момент его вызова заданная операция оказывается недопустимой, приведение типов не производится. Общий формат применения оператора dynamic_cast таков. dynamic_cast (expr)
Здесь элемент type
означает новый тип, который является целью выполнения этой операции, а элемент expr— выражение, приводимое к этому новому типу. Тип type должен быть представлен указателем или ссылкой, а выражение expr должно приводиться к указателю или ссылке. Таким образом, оператор dynamic_cast можно использовать для преобразования указателя одного типа в указатель другого или ссылки одного типа в ссылку другого.Этот оператор в основном используется для динамического выполнения операций приведения типа среди полиморфных типов. Например, если даны полиморфные классы В
и D, причем класс D выведен из класса В, то с помощью оператора dynamic_cast всегда можно преобразовать указатель D* в указатель В*, поскольку указатель на базовый класс всегда можно использовать для указания на объект класса, выведенного из базового. Однако оператор dynamic_cast может преобразовать указатель В* в указатель D* только в том случае, если адресуемым объектом действительно является объект класса D. И, вообще, оператор dynamic_cast будет успешно выполнен только при условии, если разрешено полиморфное приведение типов, т.е. если указатель (или ссылка), приводимый к новому типу, может указывать (или ссылаться) на объект этого нового типа или объект, выведенный из него. В противном случае, т.е. если заданную операцию приведения типов выполнить нельзя, результат действия оператора dynamic_cast оценивается как нулевой, если в этой операции участвуют указатели. (Если же попытка выполнить эту операцию оказалась неудачной при участии в ней ссылок, генерируется исключение типа bad_cast.)Рассмотрим простой пример. Предположим, что класс Base
— полиморфный, а класс Derived выведен из класса Base.
Base *bp, b_ob;
Derived *dp, d_ob;
bp = &d_ob; // Указатель на базовый класс указывает на объект класса Derived.
dp = dynamic_cast (bp); // Приведение к указателю на производный класс разрешено.