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

// Проверка правильности динамического приведения типа для указателя Derived* pDerived = dynamic_cast<Derived*>(pBase) ;

if ('pDerived){ // Ошибка!

// Проверка правильности динамического приведения типа для ссылки try{

Deriveds MyDerived = dynamic_cast<Derived&>(MyBase);

} , catch(bad_cast){

// Ошибка!

В остальном динамическое приведение типов для ссылок совпадает с таковым для указателей, за очевидным исключением — возвращается ссылка, а не указатель.

Не только полиморфные классы

Ограничение RTTI на использование только полиморфных классов не является абсолютно жестким. Из него есть важное исключение: приведение указателя на объект производного класса к типу базового класса. Образец кода приводится в листинге 23.4.

h06531.jpg

ttinclude <iostream.h>

//Не полиморфный класс class Base {

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

//Не полиморфный класс class Derived : public.Base (

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

void main() (

Derived MyDerived;

Derived* pMyDerived = sMyDerived;

// Успешное приведение вверх

Base* pBaseTest = dynamic_cast<Base*>(pMyDerived),

cout « "pMyDerived ";