664 _______________Часть IV. Новые возможности C++

dynamic_cast была нужна для того, чтобы выяснить тип базового указателя. Если базовый указатель оказывался не того типа, dynamic_cast возвращала NULL, что было указанием на необходимость обрабатывать данный указатель другим способом. Листинг 23.11 показывает, как для осуществления подобной проверки можно использовать операцию typeid.

h06641.jpg

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 О « ", его надо ";