Глава^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 показывает те изменения, которые нужно внести в программу, чтобы обеспечить ее правильную работу.
#include <iostream.h>
class Base ( public:
// Ничего не делает
void BaseFuncO { cout « "В классе Base.\n";