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

/ / Определение класса class Applet

// Ничего не делает

// Создание объекта Apple MyApple;

// Вывод имени объекта cout « typeid(MyApple).name « "\n";

Если вычисленное выражение соответствует объекту полиморфного класса, то операция typeid проверяет действительный объект и возвращает соответствующий объект typeinfo. Следующий фрагмент выводит на экран class Derived:

// Определение класса class Base{

// Ничего не делает

// Для того чтобы данный код работал правильно, ,

/ 1 необходимо сделать класс полиморфным

virtual void Nothing() {};

};

class Derived : public Base {

// Ничего не делает } ;

// Создание объекта Derived MyDerived;

Base* pBase = dynamic cast<Base*>(sMyDerived);

// Вывод "настоящего" типа pBase cout « typeid(*pBase).name() « "\n";

Заметим, что здесь классы должны быть полиморфными. Если опустить пустое определение метода Nothing класса Base, то результатом работы этого фрагмента программы будет сообщение, что имя типа — class Base.

! Предупреждение

При выключенной поддержке RTTI операция typeid будет работать, но при этом она может возвращать весьма неожиданные результаты. Если при выключенном RTTI программа передает в операцию typeid указатель или ссылку на полиморфный объект, typeid возвращает ссылку на экземпляр класса typeinfo, который представляет собой объявленный тип аргумента, а не тип реального объекта, соответствующего переданной ссылке или указателю. ,

Новая редакция приготовления салата

Класс typeinfo часто можно использовать в тех же случаях, что и операцию dynamic_cast. Вспомним, что в программе Saladl.cpp (см. листинг 23.2)