Язык программирования C++ от Страуструпа


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


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

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

}



Содержание раздела