Глава 23. Динамическая идентификация типов 665
cout « MyLettuce « "\n";
cout « "Это ";
cout « typeid(MyApple).name() « ", его надо "
cout « MyApple « "\n";
cout « "Это ";
cout « typeid(MyCheese).name() « ", его надо
cout « MyCheese « "\n";
Как видно из текста, Salad3.cpp аккуратно проверяет класс typeinfo для каждого передаваемого указателя для ингредиентов, сравнивая его с возможными типами продуктов. Поскольку все классы являются полиморфными, экземпляр класса typeinfo, возвращаемый операцией typeid(*pingredient), ссылается на настоящий объект, что делает сравнение возможным.
Какой же способ написания программ лучше? Выбор за программистом. Программы, опирающиеся на использование класса typeinfo, легче читаются. В то же время этот способ основывается на приведении типов в стиле С, который менее защищен и более опасен, чем при использовании операции dynamic_cast. Поскольку dynamic_ca5t выполняет сразу две задачи — проверяет тип указателя и затем осуществляет безопасное приведение типа, то операция dynamic_cast представляется более безопасной, чем typeid.
Загадка метода beforeO
Напомним, что класс typeinfo содержит метод before (), который помогает выяснять взаимоотношения классов в иерархии. К сожалению, метод beforeO ограничен (если не сказать очень ограничен) в своем применении. Рассмотрим пример из листинга 23.12.
ftinclude <iostream.h> #include <typeinfo.h>
// Определение классов
class Base {
// Ничего не делает
// Обеспечение полиморфизма
virtual void Nothing() { }
);
class Middle : public Base {
// Ничего не делает };
class Derived : public Middle { // Ничего не делает