Глава 23. Динамическая идентификация типов_______________________649

жен был бы иметь несколько виртуальных методов, возвращающих более детальную информацию о конкретном типе продукта — возможность, не реализованная в данной программе.

От класса Food наследуются несколько классов конкретных продуктов. Каждый из этих классов делает доступными методы, соответствующие различным способам приготовления этих продуктов. Никаких заумных вещей здесь нет.

Наиболее интересная часть программы — функция processingredientf). Она принимает указатель на некоторый объект типа Food. При этом ваши программы не обязаны ограничиваться использованием только фруктов или овощей. Может быть, вы предпочитаете сыр или арахисовое масло (о вкусах не спорят). Главное в том, что process ingredient не ограничивает разнообразие типов объектов, которые могут быть обработаны, кроме требования, что это должны быть продукты питания, а не широкофюзеляжные авиалайнеры или что-нибудь столь же мало аппетитное.

Функция processingredient() принимает указатель на Food и пытается привести его к различным типам. Операция dynamic_cast безопасна, если требуемое приведение типа не удается осуществить, она возвращает NULL. Таким образом, попытки приведения выполняются до тех пор, пока не будет сделано правильное приведение типа. Когда это происходит, функция распознает, на объект какого типа ссылается указатель и соответствующим образом обрабатывает объект.

dynamic_cast или виртуальные функции?

Возможность использовать операцию dynamic__cast для определения типа указателя не означает, что вы обязаны это делать. Операция dynamic_cast может быть весьма полезна для того, чтобы убедиться, что указатели ссылаются на объекты нужного типа и для обеспечения общего механизма определения типов объектов. С другой стороны, она не предназначена для использования в качестве подручного средства там, где те же задачи можно решить с помощью виртуальных функций.

Предположим, что в предыдущем примере классы имеют большее отношение именно к салату, а не просто к общему классу Food. В этом случае более успешно программа может быть написана с использованием виртуальных функций. Листинг 23.3 показывает, как может выглядеть такая программа.

h06491.jpg

#include <iostream.h>

// Некоторые необходимые определения typedef enum { WHOLE,