Читать «Справочное руководство по 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 Друзья