logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.11.3 Описания доступа

Используя уточненное имя, можно установить доступ к члену базового

класса в части public или protected описания производного класса.

Это называется описанием доступа.

Приведем пример:

class B {

int a;

public:

int b, c;

int bf();

};

class D : private B {

int d;

public:

B::c; // adjust access to `B::c'

int e;

int df();

};

int ef(D&);

Во внешней функции ef можно использовать только имена c, e, и df.

Поскольку функция df член класса D, в ней можно использовать

имена b, c, bf, d, e и df, но не a. Функция bf - член класса B и

в ней можно использовать члены a, b, c и bf.

Описания доступа не следует использовать для ограничения доступа

к члену, доступному в базовом классе, также как не следует

использовать его для обеспечения доступа к члену, который недоступен

в базовом классе, например:

class B {

public:

int a;

private:

int b;

protected:

int c;

};

class D : private B {

public:

B::a; // описать `a' как общий член D

B::b; // ошибка: попытка расширить доступ,

// `b' не может быть общим членом D

protected:

B::c; // описать `c' как защищенный член D

B::a; // ошибка: попытка сузить доступ,

// `a' не может быть защищенным членом D

};

Описание доступа для имени перегруженной функции устанавливает

доступ в базовом классе ко всем функциям с этим именем, например:

class X {

public:

f();

f(int);

};

class Y : private X {

public:

X::f; // makes X::f() and X::f(int) public in Y

};

Нельзя в производном классе установить доступ к члену базового

класса, если в производном классе определен член с этим же именем,

например:

class X {

public:

void f();

};

class Y : private X {

public:

void f(int);

X::f; // ошибка: два описания f

};