Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет129/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   125   126   127   128   129   130   131   132   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 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; // нормально 


Бьерн Страуструп.
Язык программирования С++ 
 
174 



Достарыңызбен бөлісу:
1   ...   125   126   127   128   129   130   131   132   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет