Глава 23. Динамическая идентификация типов 647
// Виртуальные методы
FoodState Food::GetState() const
{
return theFoodState;
}
void Food::SetState(const FoodState newState) {
theFoodState = newState;
)
// Перегрузка «, теперь можно вывести текущее состояние ostreams operator«(ostreams outstrm,
Foods theFood) {
switch(theFood.GetState()) (
case WHOLE: outstrm « "Целиком";
break;
case SHREDDED: outstrm « "Порезать";
break;
case GRATED: outstnn « "Натереть";
break;
case SLICED: outstrm « "Дольками";
break;
case CHOPPED: outstrm « "Кусочками";
break;
default:
outstrm « "Недопустимое состояние!";
} return outstrm;
}
// Отдельные типы продуктов
class Apple : public Food {
public:
void Chop() { SetState(CHOPPED); } void Slice() ( SetState(SLICED); }
};
class Cheese : public Food { public:
void Grate() { SetState(GRATED); } };
class Lettuce : public Food { public:
void Shredf) { SetState(SHREDDED); } };
// Обработка отдельного ингредиента void Processlngredient(Food* pingredient)