•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 "Обработка исключительных ситуаций"). Следующие фрагменты кода демонстрируют различия в процедуре определения правильности динамического приведения типов для указателей и для ссылок: