R Справочное руководство по С++

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
           };

Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.