Глава 23. Динамическая идентификация типов_______________________653
// Проверка правильности динамического приведения типа для указателя Derived* pDerived = dynamic_cast<Derived*>(pBase) ;
if ('pDerived){ // Ошибка!
// Проверка правильности динамического приведения типа для ссылки try{
Deriveds MyDerived = dynamic_cast<Derived&>(MyBase);
} , catch(bad_cast){
// Ошибка!
В остальном динамическое приведение типов для ссылок совпадает с таковым для указателей, за очевидным исключением — возвращается ссылка, а не указатель.
Не только полиморфные классы
Ограничение RTTI на использование только полиморфных классов не является абсолютно жестким. Из него есть важное исключение: приведение указателя на объект производного класса к типу базового класса. Образец кода приводится в листинге 23.4.
ttinclude <iostream.h>
//Не полиморфный класс class Base {
// Ничего не делает };
//Не полиморфный класс class Derived : public.Base (
// Ничего не делает );
void main() (
Derived MyDerived;
Derived* pMyDerived = sMyDerived;
// Успешное приведение вверх
Base* pBaseTest = dynamic_cast<Base*>(pMyDerived),
cout « "pMyDerived ";