664 _______________Часть IV. Новые возможности C++
dynamic_cast была нужна для того, чтобы выяснить тип базового указателя. Если базовый указатель оказывался не того типа, dynamic_cast возвращала NULL, что было указанием на необходимость обрабатывать данный указатель другим способом. Листинг 23.11 показывает, как для осуществления подобной проверки можно использовать операцию typeid.
ftinclude <iostream.h> ftinclude <typeinfo.h>
// Определения FoodState, Food, A^ple, Cheese и Lettuce //' такие же, как в Saladl.cpp
// Обработка отдельных ингредиентов void Processlngredient(Food* pingredient) {
// Это яблоко?
if (typeid(*plngredient)==typeid(Apple)) (, ((Apple*)pingredient)->Chop() ;
return;
}
// Это пучок салата-латук? if (typeid(*plngredient)==typeid(Lettuce)) {
((Lettuce*)pingredient)->Shred() ;
return;
}
// Это кусок сыра?
if (typeid(*plngredient)==typeid(Cheese)) ((Cheese*)pingredient)->Grate() ;
return;
}
// Займемся приготовлением салата
void main()
(
Lettuce MyLettuce;
Apple MyApple;
Cheese MyCheese; •
// Обработка овощей MyLettuce.Processlngredient();
MyApple.Processlngredient();
MyCheese.Processlngredient();
// Посмотрим, что получилось cout « "Это ";
cout « type id(MyLettuce).name О « ", его надо ";