Читать «Справочное руководство по C++» онлайн - страница 63

Бьярн Страустрап

class B {/*… */};

class D1: private B {/*… */};

class D2: public B {/*… */};

class D3: B {/*… */}; // `B' частный по определению

struct D4: public B {/*… */};

struct D5: private B {/*… */};

struct D6: B {/*… */}; // `B' частный по определению

Здесь класс является общим (public) базовым классом для D2, D4 и D6 и частным (private) базовым классом для D1, D2 и D5.

Описание базового класса как private не влияет на доступ к статическим членам базового класса. Однако, если при обращении к статическому члену используется объект или указатель, который нужно преобразовывать, то действуют обычные правила преобразования указателей.

В функциях-членах или друзьях класса X можно X* неявно преобразовывать в указатель на частный класс, являющийся непосредственно базовым по отношению к X.

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

};

R.11.4 Друзья