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

R.11.2 Спецификации доступа для базовых классов

Если класс описан как базовый ($$r.10) по отношению к

другому классу с помощью спецификации доступа public, то члены со

спецификацией public или protected из базового класса являются

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

Если класс описан как базовый по отношению к другому с помощью

спецификации доступа private, то члены со спецификацией public или

protected из базового класса являются членами со спецификацией

private для производного класса. Частные члены базового класса

остаются недоступными даже для производных классов, если только для

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

описание friend.

Если для базового класса не указана спецификация-доступа, то

для производного класса, если он описан как struct, предполагается

спецификация public, а если он описан со служебным словом

class, то - спецификация private, например:

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.