Глава 23. Динамическая идентификация типов 659
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 потерпел неудачу
Полное обсуждение тонкостей условных объявлений не входит в задачи настоящей главы; важно, чтобы вы, как минимум, сумели распознать при-