658_______________________________Часть IV. Новые возможности С++
• // Теперь класс полиморфный, так что можно использовать RTTI
virtual void Nothing О ( } };
// Не полиморфный класс
class Middlel : virtual public Base {
public:
// Ничего не делает
void MiddlelFuncO { cout « "В классе Middlel.\n"; )
//He полиморфный класс " . class Middle2 : virtual public Base { public:
// Ничего не делает
void Middle2Func() { cout « "В классе Middle2.\n"; } );
// He полиморфный класс
class Derived : public Middlel, public Middle2 {
public:
// Ничего не делает
void DerivedFunc() { cout « "В классе Derived.\n"; } );
void main() (
Derived MyDerived;
Base* pBase = dynamic_cast<Base*>(&MyDerived) ;
pBase->BaseFunc();
Derived* pDerived = dynamic_cast<Derived*>(pBase);
pDerived->DerivedFunc() ;
Эта версия не только компилируется, но и выполняется ожидаемым образом. Такая процедура может показаться редкой и нужной лишь очень узкому кругу пользователей, но тем не менее вы, конечно же, оцените dynamic_cast в тех случаях, когда подобные манипуляции все же понадобятся.
Завершая обсуждение применения операции dynamic_cast для иерархий, отягощенных множественным наследованием, заметим, что RTTI дает возможность программам приводить указатели и ссылки поперек дерева наследования. Принципиально это действие аналогично приведению указателя базового класса к типу уровня самого низкого в иерархии класса и затем приведении того же указателя обратно на вершину дерева, но по-другому пути этой иерархии. Листинг 23.10 показывает, как изменить пример Vrtbase3.cpp для демонстрации этой побочной возможности приведения типов.