ОБЪЕКТНО-ОРИЕНТИРОВАННОЕ ПРОГРАММИРОВАНИЕ В C++ (4-Е ИЗДАНИЕ) (часть 9) онлайн
Комбинации доступа
Существует очень много возможностей для доступа, и полезно будет изучить программу примера, показывающую, какая комбинация будет работать, а какая нет. Рассмотрим листинг программы PUBPRIV:
// pubpriv.cpp
// испытание классов наследованных как public и private
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class A // базовый класс
{
private: // тип доступа к данным совпадает с типом
int privdataA; // доступа к функциям
protected:
int protdataA;
public:
int pubdataA;
};
///////////////////////////////////////////////////////////
class B : public A // public наследование
{
public:
void funct ( )
{
int a;
a = privdataA; // ошибка, нет доступа
a = protdataA; // так можно
a = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
class C : private A // private наследование
{
public:
void funct ( )
{
int a;
a = privdataA; // ошибка, нет доступа
a = protdataA; // так можно
a = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
int main ( )
{
int a;
B objB;
a = objB.privdataA; // ошибка, нет доступа
a = objB.protdataA; // ошибка, нет доступа
a = objB.pubdataA; // так можно
C objC;
a = objC.privdataA; // ошибка, нет доступа
a = objC.protdataA; // ошибка, нет доступа
a = objC.pubdataA; // ошибка, нет доступа
return 0;
}
В программе описан класс A, имеющий данные со спецификаторами доступа private, public и protected. Классы В и C являются производными классами. Класс В является общим наследником, а класс C — частным наследником от класса A.
Как мы видели ранее, методы производных классов имеют доступ к данным базового класса, объявленным как public или protected. Для объектов производ- ных классов нет доступа к членам базового класса, объявленным как protected или private.
Что нового в различиях между общими и частными производным и классами? Объекты общего наследника класса B имеют доступ к членам класса A, объяв- ленным как public или protected, а объекты частного наследника класса C имеют доступ только к членам, объявленным как public. Это показано на рис. 9.7.
Если не указывать спецификатор доступа при создании класса, то будет ис- пользован спецификатор private.
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42