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

h06591.jpg

II Все определения классов те же, что и в примере vrtbase3.cpp

1 void main()

2 {

3 Derived MyDerived;

4 Middlel* pMiddlel = dynamic_cast<Middlel*>(&MyDerived) ;

5 pMiddlel->MiddlelFunc() ;

6 Middle2* pMiddle2 = dynamic_cast<Middle2*>(pMiddlel);

7 pMiddle2->Middle2Func();'•

8 }

В этом примере указатель pMiddlel устанавливается на средний в иерархии класс (строка 4). В строке 6 программа использует операцию dynamic cast для передвижения через дерево наследования к другому классу, находящемуся между Base и Derived. Заметьте, что не делается никаких ссылок на Derived, и компилятор сам находит путь от одного класса дерева к другому.

Объявления в условных операторах

Комитет по стандартам ANSI C++ утвердил изменения в языке, допускающие объявления внутри условных операторов, таких как if, while и switch. Эти объявления могут использоваться в связке с операцией dynamic_cast. Компилятор Borland — один из первых обеспечил такую возможность.

Условное объявление (conditional declaration) основано на новой возможности C++, позволяющей при объявлении переменной возвращать некоторое значение, которое при этом можно использовать в выражении. Рассмотрим, например, следующий фрагмент:

MyClass* pMydass = new MyClass;

При условном объявлении теперь еще и возвращается значение, указывающее, был ли pMydass правильно инициализирован. Это объявление можно переписать таким образом, чтобы выявить возможные ошибки распределения памяти.

if (MyClass* pMydass = new MyClass) (

// Некоторые действия } else{ '

// Вызов операции new потерпел неудачу

Полное обсуждение тонкостей условных объявлений не входит в задачи настоящей главы; важно, чтобы вы, как минимум, сумели распознать при-