Бьерн Страуструп - Язык программирования С++. Главы 5-8
Страница 45. Доступ к базовым классам



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;   // нормально
            }

 
« Предыдущая статья   Следующая статья »