Глава 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)