1.13 Производные классы

1.13 Производные классы

Теперь давайте определим вектор, для которого пользователь может задавать границы изменения индекса.

class vec: public vector (* int low, high; public: vec(int,int);

int amp; elem(int); int amp; operator[](int); *);

Определение vec как :public vector

означает, в первую очередь, что vec – это vector. То есть, тип vec имеет (наследует) все свойства типа vector дополнительно к тем, что описаны специально для него. Говорят, что vector является базовым классом для vec, а о vec говорится, что он производный класс от vector. Класс vec модифицирует класс vector тем, что в нем задается другой конструктор, который требует от пользователя указывать две границы изменения индекса, а не длину, и имеются свои собственные функции доступа elem(int) и operator[](int). Функция elem() класса vec легко выражается через elem() класса vector: int amp; vec::elem(int i) (* return vector::elem(i-low); *)

Операция разрешения области видимости :: используется для того, чтобы не было бесконечной рекурсии обращения к vec::elem() из нее самой. с помощью унарной операции :: можно ссылаться на нелокальные имена. Было бы разумно описать vec:: elem() как inline, поскольку, скорее всего, эффективность существенна, но необязательно, неразумно и невозможно написать ее так, чтобы она непосредственно использовала закрытый член v класса vector. Функции производного класса не имеют специального доступа к закрытым членам его базового класса.

Конструктор можно написать так:

vec::vec(int lb, int hb) : (hb-lb+1) (* if (hb-lb«0) hb = lb; low = lb; high = hb; *)

Запись: (hb-lb+1) используется для определения списка параметров конструктора базового класса vector::vector(). Этот конструктор вызывается перед телом vec::vec(). Вот небольшой пример, который можно запустить, если скомпилировать его вместе с остальными описаниями vector:

#include «streams.h»

void error(char* p) (* cerr «„ p «« « “; // cerr – выходной поток сообщений об ошибках exit(1); *)

void vector::set_size(int) (* /* пустышка */ *)

int amp; vec::operator[](int i) (* if (i«low !! high„i) error(«vec index out of range“); // индекс vec за границами return elem(i); *)

main() (* vector a(10); for (int i=0; i«a.size(); i++) (* a[i] = i; cout „„ a[i] «« " "; *) cout «« « “; vec b(10,19); for (i=0; i«b.size(); i++) b[i+10] = a[i]; for (i=0; i«b.size(); i++) cout «« b[i+10] «« " "; cout «« « “; *)

Он выдает 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9

Это направление развития векторного типа можно разрабатывать дальше. Довольно просто сделать многомерные массивы, массивы, в которых число размерностей задается как параметр конструктора, массивы в стиле Фортрана, к которым можно одновременно обращаться и как к имеющим две размерности, и как к имеющим три, и т.д.

Так класс управляет доступом к некоторым данным. Поскольку весь доступ осуществляется через интерфейс, обеспеченный открытой частью класса, то можно использовать представление данных в соответствие с нуждами разработчика. Например, тривиально можно было бы поменять представление вектора на связанный список. Другая сторона этого состоит в том, что при заданной реализации можно обеспечить любой удобный интерфейс.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг:

Производные данные

Из книги автора

Производные данные Я уже упомянул выше, что, зная IP-адреса, можно определить географическое расположение пользователя, а зная referrer – запрос, по которому пользователь нашел ссылку на наш сайт в поисковой системе. Это так называемые производные данные – они получены за


37. Производные классы

Из книги автора

37. Производные классы Производные классы предоставляют простой и эффективный аппарат задания для класса альтернативного интерфейса и установления класса путем добавления возможностей к уже существующему классу без перепрограммирования или перекомпиляции. С помощью


R.3.6.2 Производные типы

Из книги автора

R.3.6.2 Производные типы Существует потенциально бесконечное число производных типов, которые строятся из основных типов следующими способами:массив объектов данного типа, §R.8.4;функции, имеющие параметры данного типа и возвращающие объекты данного типа, §R.8.2.5;указатели на


Классы

Из книги автора

Классы Класс — это структура, предназначенная для хранения данных (полей и свойств), а также кода, обрабатывающего эти данные (методы). Поля, методы и свойства называют членами класса.Класс может быть создан на основе другого класса — в этом случае он называется


5. Производные операции

Из книги автора

5. Производные операции Итак, мы рассмотрели различные варианты операций соединения, а именно операции внутреннего соединения, левого, правого и полного внешнего соединения, которые являются производными восьми исходных операций реляционной алгебры: унарных операций


3. Производные правила вывода

Из книги автора

3. Производные правила вывода Другим примером правил, с помощью которых можно, при необходимости вывести новые правила функциональной зависимости, являются так называемые производные правила вывода.Что это за правила, как они получаются?Известно, что если из одних


1.3.2 Производные Типы

Из книги автора

1.3.2 Производные Типы Вот операции, создающие из основных типов новые типы:* указатель на *const константный указатель на amp; ссылка на [] вектор* () функция, возвращающая– * одномерный массив. Это принятый термин (например, вектора прерываний), и мы сочли, что стандартный перевод


1.13 Производные классы

Из книги автора

1.13 Производные классы Теперь давайте определим вектор, для которого пользователь может задавать границы изменения индекса.class vec: public vector (* int low, high; public: vec(int,int);int amp; elem(int); int amp; operator[](int); *);Определение vec как :public vectorозначает, в первую очередь, что vec – это vector. То есть, тип vec


2.3.3 Производные Типы

Из книги автора

2.3.3 Производные Типы Другие типы можно выводить из основных типов (и типов, определенных пользователем) посредством операций описания:* указатель amp; ссылка [] вектор () функцияи механизма определения структур. Например:int* a; float v[10]; char* p[20]; // вектор из 20 указателей на символ


Глава 7 Производные Классы

Из книги автора

Глава 7 Производные Классы Не надо размножать объекты без необходимости У. Оккам В этой главе описывается понятие производного класса в С ++. Производные классы дают простой, гибкий и эффективный апарат задания для класса альтернативного интерфейса и опредления класса


7.2 Производные Классы

Из книги автора

7.2 Производные Классы Чтобы разделить задачи понимания аппарата языка и метдов его применения, знакомство с понятием производных классов делается в три этапа. Вначале с помощью небольших примеров, которые не надо воспринимать как реалистичные, будут описанысами


4.4 Производные Типы

Из книги автора

4.4 Производные Типы Кроме основных арифметических типов концептуально сществует бесконечно много производных типов, сконструированых из основных типов следующим образом:массивы объектов данного типа;функции, получающие аргументы данного типа и возвращащие объекты


8.5.3 Производные Классы

Из книги автора

8.5.3 Производные Классы В конструкциисост идентификатор : public opt typedef-имяtypedef-имя должно означать ранее описанный класс, назваемый базовым классом для описываемого класса. Говорится, что последний выводится из предшествующего (является проиводным от него). По поводу смысла


Классы

Из книги автора

Классы ОО-метод основан на понятии класса. Неформально, класс - элемент ПО, описывающий абстрактный тип данных и его частичную или полную реализацию. Абстрактный тип данных - множество объектов, определяемое списком компонентов (features) - операций, применимых к этим


Отложенные классы как частичные интерпретации: классы поведения

Из книги автора

Отложенные классы как частичные интерпретации: классы поведения Не все отложенные классы так близки к АТД как STACK. В промежутке между полностью абстрактным классом, таким как STACK, в котором все существенные компоненты отложены, и эффективным классом, таким как FIXED_STACK,