Байланысты: Бьерн Страуструп. Язык программирования С . М Бином, 2011
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; // нормально