Справочное руководство по 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.

};