"Мюррэй Хилл, Бьярн Страустрап. Язык С++" - читать интересную книгу автора

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

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

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;
}