Теперь давайте определим вектор, для которого пользователь может задавать границы изменения индекса.
class vec: public vector { int low, high; public: vec(int,int); int& elem(int); int& operator[](int); };
Определение vec как
:public vector
означает, в первую очередь, что vec это vector. То есть, тип vec имеет (наследует) все свойства типа vector дополнительно к тем, что описаны специально для него. Говорят, что класс vector является базовым классом для vec, а о vec говорится, что он производный от vector.
Класс vec модифицирует класс vector тем, что в нем задается другой конструктор, который требует от пользователя указывать две границы изменения индекса, а не длину, и имеются свои собственные функции доступа elem(int) и operator[](int). Функция elem() класса vec легко выражается через elem() класса vector:
int& 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
void error(char* p) { cerr << p << "n\"; // cerr - выходной поток сообщений об ошибках exit(1); }
void vector::set_size(int) { /* пустышка */ }
8 8 8
|