1.
Понятие абстрактного типа данных.
2.
Чистые виртуальные функции.
1.
Понятие абстрактного типа данных.
Дружественная (friend) функция — это
функция, которая, не будучи членом класса, имеет доступ к его приватным членам.
Абстрактные типы данных (abstract data
type, в дальнейшем АТД) позволяют создавать программы с
использованием высокоуровневых абстракций. За счет применения абстрактных типов
данных появляется возможность отделять абстрактные (концептуальные)
преобразования, которые программы выполняют над данными, от любого конкретного
представления структуры данных и любой конкретной реализации алгоритма.
Абстрактные типы данных предоставляют в наше
распоряжение постоянно расширяющийся набор инструментальных средств, позволяющий
приниматься за решение все новых и новых задач.
Абстрактные конструкции более высокого
уровня часто создаются на основе более простых конструкций. На всех уровнях
действует один и тот же основной принцип: в своих программах надо найти
наиболее важные операции и наиболее важные характеристики данных, затем точно
определить и те и другие на абстрактном уровне и разработать эффективные
конкретные механизмы для их поддержки.
Для разработки нового уровня абстракции
потребуется определить абстрактные объекты, с которыми необходимо
манипулировать, и операции, которые должны выполняться над ними; мы должны
представить данные в некоторой структуре данных и реализовать операции.
Абстрактный тип данных (АТД) — это тип
данных (набор значений и совокупность операций для этих значений), доступ к
которому осуществляется только через интерфейс.
Class share
{
public:
share() {}
virtual void draw() {}
private:
};
Class circle: public share
{
circle () {}
void draw() {}
private:….
};
Все методы должны функционировать нормально
в производных классах, но не в классе share, поскольку
невозможно создать экземпляр формы как таковой. Программа должна быть защищена
от попытки пользователя создать объект этого класса. Класс share существует только для того, чтобы поддерживать интерфейс,
общий для всех производных классов, поэтому об этом типе данных говорят как об
абстрактном, или АТД.
Абстрактный тип данных представляет
общую концепцию, такую как форма, а не отдельные объекты. В С++ АТД по
отношению к другим классам всегда выступает как базовый, для которого
невозможно создать функциональный объект абстрактного класса.
2.
Чистые виртуальные функции.
C++
поддерживает создание абстрактных типов данных с чистыми виртуальными
функциями. Чистыми виртуальными функциями называются такие, которые
инициализируются нулевым значением, например:
virtual
void draw()=0;
Класс, содержащий чистые виртуальные
функции, является АТД. Невозможно создать объект для класса, который является
АТД. Попытка создания объекта для такого класса вызовет сообщение об ошибке во
время компиляции. Помещение в класс чистой виртуальной функции будет означать
следующее:
- невозможность создания объекта этого
класса;
- необходимость замещения чистой
виртуальной функции в производном классе.
Любой класс, произведенный от АТД,
унаследует от него чистую виртуальную функцию, которую необходимо будет
заместить, чтобы получить возможность создавать объекты этого класса.
Чтобы объявить класс как абстрактный тип
данных, достаточно добавить в него одну или несколько чистых виртуальных
функций. Для этого после объявления функции необходимо добавить =0, например:
Class
share
{
Virtual
void draw()=0;
// чистая виртуальная функция
}
Выполнение чистых виртуальных функций
Обычно
чистые виртуальные функции объявляются в абстрактном базовом классе и не
выполняются. Поскольку невозможно создать объект абстрактного базового класса,
как правило, нет необходимости и в выполнении чистой виртуальной функции. Класс
АТД существует только как объявление интерфейса объектов, создаваемых в
производных классах.
Тем не менее все же иногда возникает
необходимость выполнения чистой виртуальной функции. Она может быть вызвана из
объекта, произведенного от АТД, например чтобы обеспечить общую
функциональность для всех замещенных функций.
В реальной программе чистая виртуальная
функция может содержать достаточно сложный программный код, например создание
окна, в котором рисуются все фигуры, выбираемые пользователем.
Подводя
итог, перечислим каким целям должен служить абстрактный тип:
[1] определять некоторое понятие таким
образом, что в программе могут сосуществовать для него несколько реализаций;
[2] применяя виртуальные функции,
обеспечивать достаточно высокую степень компактности и эффективности выполнения
программы;
[3] сводить к минимуму зависимость любой
реализации от других классов;
[4] представлять само по себе осмысленное
понятие.