Глава 23. Динамическая идентификация типов_______________________655
Исправить листинг 23.5 можно добавлением одной строки в определение класса Base, как показано в листинге 23.6.
class Base (
// Ничего не делает void virtual Nothing() { ) // Теперь класс полиморфный
Это 'изменение избавляет про грамму от ошибок и делает ее компилируемой, компонуемой и выполняемой.
RTTI и множественное наследование
До появления RTTI программисты часто испытывали затруднения при попытках написать код, позволяющий приводить указатель к нижнему типу иерархии классов, включающей виртуальный базовый класс*. C++ просто не поддерживает такие возможности для обычного синтаксиса приведения типов.
Листинг 23.7 демонстрирует очень простую иерархию классов, состоящую из базового класса Base, двух классов Middle, производных от базового класса, и наконец главного класса Derived — класса, получаемого множественным наследованием из обоих классов среднего уровня. Программа просто пытается получить указатель на экземпляр класса Derived, привести указатель вверх к уровню класса Base, а затем привести его обратно к уровню Derived.
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 (