Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

1.4.6 Множественные реализации

Основные средства, поддерживающие объектно-ориентированное

программирование, а именно: производные классы и виртуальные функции,-

можно использовать и для поддержки абстракции данных, если допустить

несколько реализаций одного типа. Вернемся к примеру со стеком:

template < class T >

class stack

{

public:

virtual void push ( T ) = 0; // чистая виртуальная функция

virtual T pop () = 0; // чистая виртуальная функция

};

Обозначение =0 показывает, что для виртуальной функции не требуется

никакого определения, а класс stack является абстрактным, т.е. он может

использоваться только как базовый класс. Поэтому стеки можно использовать,

но не создавать:

class cat { /* ... */ };

stack < cat > s; // ошибка: стек - абстрактный класс

void some_function ( stack <cat> & s, cat kitty ) // нормально

{

s.push ( kitty );

cat c2 = s.pop ();

// ...

}

Поскольку интерфейс стека ничего не сообщает о его представлении, от

пользователей стека полностью скрыты детали его реализации.

Можно предложить несколько различных реализаций стека. Например, стек

может быть массивом:

template < class T >

class astack : public stack < T >

{

// истинное представление объекта типа стек

// в данном случае - это массив

// ...

public:

astack ( int size );

~astack ();

void push ( T );

T pop ();

};

Можно реализовать стек как связанный список:

template < class T >

class lstack : public stack < T >

{

// ...

};

Теперь можно создавать и использовать стеки:

void g ()

{

lstack < cat > s1 ( 100 );

astack < cat > s2 ( 100 );

cat Ginger;

cat Snowball;

some_function ( s1, Ginger );

some_function ( s2, Snowball );

}

О том, как представлять стеки разных видов, должен беспокоиться только

тот, кто их создает (т.е. функция g()), а пользователь стека (т.е. автор

функции some_function()) полностью огражден от деталей их реализации.

Платой за подобную гибкость является то, что все операции над стеками

должны быть виртуальными функциями.

1.5 Поддержка объектно-ориентированного программирования

Поддержку объектно-ориентированного программирования обеспечивают

классы вместе с механизмом наследования, а также механизм вызова

функций-членов в зависимости от истинного типа объекта (дело в том, что

возможны случаи, когда этот тип неизвестен на стадии трансляции). Особенно

важную роль играет механизм вызова функций-членов. Не менее важны

средства, поддерживающие абстракцию данных (о них мы говорили ранее). Все

доводы в пользу абстракции данных и базирующихся на ней методов, которые

позволяют естественно и красиво работать с типами, действуют и для языка,

поддерживающего объектно-ориентированное программирование. Успех обоих

методов зависит от способа построения типов, от того, насколько они

просты, гибки и эффективны. Метод объектно-ориентированного

программирования позволяет определять более общие и гибкие

пользовательские типы по сравнению с теми, которые получаются, если

использовать только абстракцию данных.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]