return 0;
Здесь демонстрируется операция typeid, сравнение типов и функция name () класса type_inf о. Программа выводит:
Typeinfo of bRef: Derived
Contents of bRef: Derived class' string.
Сравнение типов объекта bRef и Derived показывает, что они совпадают, и программа приводит ссылку к производному типу. Если закомментировать виртуальный деструктор класса Base, он станет неполиморфным, и typeid уже не сможет определить тип объекта, на который в действительности ссылается bRef:
Typeinfo of bRef: Base
Cannot cast safely bRef to Derived.
Эта программа является примером того, как не следует поступать. Идентифицировать класс, затем привести ссылку к нужному типу — это попытка поставить RTTI на место виртуального механизма. Гораздо проще сделать функцию Get() виртуальной:
class Base { public:
virtual ~Base () { }
virtual const char *Get() { throw MyExcpt; } };
try {
cout << "Contents of bRef: " << bRef.Get() << endl;
} catch(MyExcept) {
}
При недопустимом типе объекта выбрасывается исключение (возможны и другие решения).
RTTI следует применять только в тех случаях, когда тип объекта не известен во время компиляции и нецелесообразно применение других средств C++ вроде позднего связывания.