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

Исправить листинг 23.5 можно добавлением одной строки в определение класса Base, как показано в листинге 23.6.

class Base (

// Ничего не делает void virtual Nothing() { ) // Теперь класс полиморфный

Это 'изменение избавляет про грамму от ошибок и делает ее компилируемой, компонуемой и выполняемой.

RTTI и множественное наследование

До появления RTTI программисты часто испытывали затруднения при попытках написать код, позволяющий приводить указатель к нижнему типу иерархии классов, включающей виртуальный базовый класс*. C++ просто не поддерживает такие возможности для обычного синтаксиса приведения типов.

Листинг 23.7 демонстрирует очень простую иерархию классов, состоящую из базового класса Base, двух классов Middle, производных от базового класса, и наконец главного класса Derived — класса, получаемого множественным наследованием из обоих классов среднего уровня. Программа просто пытается получить указатель на экземпляр класса Derived, привести указатель вверх к уровню класса Base, а затем привести его обратно к уровню Derived.

h06551.jpg

ftinclude <iostream.h>

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

class Base {

public:

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

void BaseFunc() { cout « "В классе Base.\п"; ) };

//Не полиморфный класс class Middlel : public Base ( public:

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

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

// He полиморфный класс class Middle2 : public Base (