public:

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

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

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

class Derived : public Middlel, public Middle2 (

public:

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

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

void main() (

Derived My Derived;

Base* pBase = (Base*) &MyDerived;

pBase->BaseFunc() ;

Derived* pDerived = (Derived*) pBase;

pDerived->DerivedFunc();

}

В таком виде программа не компилируется. Компилятор выдает следующие два сообщения об ошибках: "Невозможно осуществить приведение типа от

'Derived *' К 'Base *'" (Cannot cast from 'Derived *' to 'Base *') И

"Невозможно осуществить приведение типа от 'Base *' к 'Derived *'" (cannot

cast from 'Base *' to 'Derived *').

Первую ошибку легко исправить. Поскольку Derived получается двойным косвенным наследованием из Base, мы имеем классическую проблему "раздвоения личности" объекта, которая всегда была мучением при множественном наследовании. Ясно, что нужно просто сделать Base виртуальным базовым классом. Листинг 23.8 показывает изменения в определениях классов Middlel и Midle2, которые решают данную проблему.

h06561.jpg

ftinclude <iostream.h>

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

slass Base {

public:

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

void BaseFuncO { cout « "В классе Base.Vn"; } };

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

;lass Middlel : virtual public Base {

aublic: