•cout « "Сыр: ";

cout « MyCheese « "\n";

Как легко видеть, этот вариант приготовления салата полностью исключает использование RTTI. Так происходит потому, что виртуальная функция

ProcessIngredientO, имеющаяся у каждого ПрОИЗВОДНОГО ОТ Saladlgredient

класса, меняет нужным образом статус объекта. В данном случае виртуальная функция оказывается более понятным и аккуратным средством, чем динамическое приведение типа и конструкции из вложенных операторов if в листинге 23.2.

Совет

Каждый раз, когда у вас появляется соблазн использовать операцию dynamic_cast для определения типа указателя (вместо того, чтобы просто сделать приведение типа), спросите себя, нельзя ли сделать то же самое с помощью виртуальных функций. Изящество полиморфизма виртуальных функций предпочтительнее грубой силы операции dynamic_cas1:.

Разумеется, некоторые из классов конкретных продуктов могут понадобиться в контексте, отличном от приготовления салата. В иерархию классов может входить, например, класс pizzaingredient (ингредиенты пиццы). Тогда класс cheese может путем множественного наследования наследоваться

ОТ обоих классов — Saladlngredient И Pizzaingredient. Однако будьте ОСТОРОЖНЫ при использовании этого подхода: вам необходимо обеспечить, чтобы класс Food был виртуальным базовым классом. Кроме того, чтобы избежать Конфликта имен, В классах Saladlngredient И Pizzaingredient ПрИДСТСЯ

изменить имя метода ProcessIngredientO. В некоторых случаях, чтобы избежать множественного наследования и связанных с этим сложностей, лучше воспользоваться RTTI.

dynamic_cast и ссылки

Операцию dynamic_cast можно использовать и для создания ссылки определенного типа. Синтаксис такой операции выглядит так:

dynamic_cast<T&>{ref);

Здесь т обозначает произвольный допустимый тип C++, a ref — исходную ссылку. Такое приведение возвращает ссылку типа т только в случае, если ref ссылается на объект типа г. Поскольку ссылок NULL не бывает, определить, была ли успешной попытка динамического приведения 'типа для ссылки, не представляется возможным. В случае неуспеха возбуждается исключительная ситуация Bad_cast (подробно об исключительных ситуациях см. в главе 22 "Обработка исключительных ситуаций"). Следующие фрагменты кода демонстрируют различия в процедуре определения правильности динамического приведения типов для указателей и для ссылок: