|
Полиморфные указываемые объекты В базовом варианте ведущего указателя присутствует переменная с типом 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). А пока продолжим изучение указателей и всего, что с ними связано. |
Copyright 2005. Климов Александр. All Right Reserved.