Глава 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)