Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование на C / C++ / C++ for real programmers.pdf
Скачиваний:
261
Добавлен:
02.05.2014
Размер:
2.04 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). А пока продолжим изучение указателей и всего, что с ними связано.