Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Элджер Д. - C++. Библиотека программиста - 1999.pdf
Скачиваний:
141
Добавлен:
13.08.2013
Размер:
1.98 Mб
Скачать

106

Переходные типы

Основная идея переходного типа (malleable type) - класс, экземпляры которого как бы изменяют свой тип во время выполнения программы. Конечно, формально В C++ такого происходить не может — иначе вам пришлось бы всерьез и надолго подружиться с отладчиком. Тем не менее, чудеса современных указателей позволяют добиться почти того же эффекта.

Полиморфные указываемые объекты

В базовом варианте ведущего указателя присутствует переменная с типом Pointee*. Нo кто сказал, что объект, на который она ссылается, должен быть настоящим Pointee, а не каким-нибудь классом, производным от Pointee?

// В файле Foo.h class Foo { protected:

Foo();

public:

// Члены Foo

};

class Pfoo { // Ведущий указатель private:

Foo* foo; public:

PFoo();

Foo* operator->() const { return foo; }

// Остальные члены, характерные для ведущих указателей

};

// В файле Foo.cpp

class DerivedFromFoo : public Foo { private:

//Закрытые члены производного класса

public:

DerivedFromFoo(); // Функция открытая, но спрятанная в файле .cpp

//Переопределения функций класса Foo

};

PFoo::PFoo() : foo(new DrivedFromFoo)

{

}

Ловкость рук и никакого мошенничества! Ведущий указатель подсунул вместо Foo нечто совершенно иное, а клиенты ничего не замечают. Ага! Теперь вы понимаете, почему конструктор Foo объявлялся защищенным, а не закрытым! Класс PFoo уже можно не объявлять другом; доступ к конструкторам Foo нужен только конструктору DerivedFromFoo.

В части 3 мы поговорим о том, какое наследование нужно, чтобы эта схема работала (а именно, чтобы все классы, производные от Foo, имели тот же открытый интерфейс, что и сам Foo). А пока продолжим изучение указателей и всего, что с ними связано.

Соседние файлы в предмете Программирование на C++