Глава 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 { // Ничего не делает