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 для демонстрации этой побочной возможности приведения типов.