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

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

void MiddielFunc() { cout « "В классе Middlel.\n"; } };

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

class Middle2 : virtual public Base {

public:

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

void Middle2Func() { cout « "В классе Middle2.\n"; } };

//He 'полиморфный класс

class Derived : public Middlel, public Middle2 {

public:

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

void DerivedFuncO { cout « "В классе Derived.\n"; } }!

void main() { '

Derived MyDerived;

Base* pBase = (Base*) SMyDerived;

pBase->BaseFunc();

Derived* pDerived = (Derived*) pBase;

pDerived->DerivedFunc() ;

}

Решение, предлагаемое в листинге 23.8, уже почти работает. Программа, однако, все еще не компилируется. По-прежнему остается сообщение:

"Невозможно осуществить приведение типа от 'Base *' к 'Derived *' ". Причина того, что нельзя выполнить простое преобразование типов от виртуального базового класса вниз к производному классу, заключается в ограничениях самого C++. Без использования RTTI нет простого и безопасного способа решить эту задачу.

Поскольку компилятор Borland C++ поддерживает dynamic_cast, появляется простой и корректный способ решения задачи. Листинг 23.9 показывает те изменения, которые нужно внести в программу, чтобы обеспечить ее правильную работу.

h06571.jpg

#include <iostream.h>

class Base ( public:

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

void BaseFuncO { cout « "В классе Base.\n";