Бьерн Страуструп - Абстракция данных в языке С++ - Полиморфные классы
ОГЛАВЛЕНИЕ
Полиморфные классы
Полиморфные классы определяются тем же образом,а что и
полиморфные функции. Например:
class set : public common {
class set_mem {
set_mem *next;
object *mem;
set_mem(common *m, set_mem *n)
{ mem = m; next = n;}
} *tail;
public:
int insert(common *);
int remove(common *);
int member(common *);
set()
{ tail = 0; }
- set()
{ if (tail) error("непустое множество"); }
}
Таким образом, класс s e t (для реализации множества)
реализован как связанный список объектов s e t _ m e m , каждый
из которых указывает на класс c o m m o n . Указатели на объекты
(не сами объекты) введены в класс. Для полноты описания класс
s e t сам является производным c o m m o n , таким образом,
можно создать множество множеств. Так как класс s e t
реализован независимо от данных составляющих его объектов,
объект может быть членом двух и более множеств. Такая модель
являетсяа очень общей и может быть использованаа( и в
действительности использовалась) для создания "абстракций" типа
множество, вектор, связанный список, таблица. Наиболее
отличительная черта данной модели для "классов-контейнеров"
состоитв том, что, в общем случае, ни контейнер не зависит от
данных, содержащихся в объектах, ни сами объекты независят от
данных, идентифицирующих их контейнер (контейнеры). Это часто
является важным структурным преимуществом : классы могут
проектироваться и использоваться без забот о том, структуры
данных какого типа необходимы для программы, их использующей.
Наиболее очевидный недостаток состоитв том, что издержки
составляют как минимум один указатель на член класса (два
указателя в рамках вышеприведенного класса s e t для реализации
связанного спискай (*1). Другое преимущество состоитв том,а что
такие классы-контейнеры могут быть способны содержать
гетерогенный набор членов (*2). Если это нежелательно, можно
тривиальныма образом определить производный класс, который
допускает в качестве членов только один конкретный класс.
Например:
class apple_set: public set {
public:
int insert(apple *a) { return set::insert(a); }
int remove(apple *a) { return set::remove(a); }
int member(apple *a) { return set::member(a); }
};
__________
(*1) Плюс еще один указатель для реализации механизма виртуальных функций.
См.ниже секцию 21. "Эффективность".
(*2) То есть, разных классов. - прим.переводчика.
Заметим,а что, так как функции класса a p p l e _ s e t не
выполняют никаких действий в дополнение к тем, что выполняют
функции базового класса s e t , они будут полностью (то есть до
полного отсутствия каких бы то ни было издержек) оптимизированы.
Они служат только для того, чтобы обеспечить контроль типов во
время компиляции.
Класс c o m m o n подходящим набором полиморфных классов
и функций находится в стадии разработки. Предполагается, что он
будет входить в состав стандартной библиотеки.