Материалы книги получены с http://www.itlibitum.ru/
Полиморфные указываемые объекты
В базовом варианте ведущего указателя присутствует переменная с типом 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). А пока продолжим изучение указателей и всего, что с ними связано.
Назад Содержание Далее
|