6.6.2 Доступ к базовым классам.

   


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

Подобно члену базовый класс можно описать как частный, защищенный или общий:

           class X {
           public:
             int a;
             // ...
           };

           class Y1 : public X {  };
           class Y2 : protected X { };
           class Y3 : private X { };

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

           void f(Y1* py1, Y2* py2, Y3* py3)
           {
             X* px = py1;  // нормально: X - общий базовый класс Y1
             py1->a = 7;   // нормально
             px = py2;     // ошибка: X - защищенный базовый класс Y2
             py2->a = 7;   // ошибка
             px = py3;     // ошибка: X - частный базовый класс Y3
             py3->a = 7;   // ошибка
           }

Теперь пусть описаны

           class Y2 : protected X { };
           class Z2 : public Y2 { void f(); };

Поскольку X - защищенный базовый класс Y2, только друзья и члены Y2, а также друзья и члены любых производных от Y2 классов (в частности Z2) могут при необходимости преобразовывать (неявно) Y2* в X*. Кроме того они могут обращаться к общим и защищенным членам класса X:

           void Z2::f(Y1* py1, Y2* py2, Y3* py3)
           {
             X* px = py1; // нормально: X - общий базовый класс Y1
             py1->a = 7; // нормально
             px = py2;   // нормально: X - защищенный базовый класс Y2,
                         // а Z2 - производный класс Y2
             py2->a = 7; // нормально
             px = py3;   // ошибка: X - частный базовый класс Y3
             py3->a = 7; // ошибка
           }

Наконец, рассмотрим:

           class Y3 : private X { void f(); };

Поскольку X - частный базовый класс Y3, только друзья и члены Y3 могут при необходимости преобразовывать (неявно) Y3* в X*. Кроме того они могут обращаться к общим и защищенным членам класса X:

           void Y3::f(Y1* py1, Y2* py2, Y3* py3)
           {
             X* px = py1;  // нормально: X - общий базовый класс Y1
             py1->a = 7;   // нормально
             px = py2;     // ошибка: X - защищенный базовый класс Y2
             py2->a = 7;   // ошибка
             px = py3;     // нормально: X - частный базовый класс Y3,
                           // а Y3::f член Y3
             py3->a = 7;   // нормально
           }

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


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

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