Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Установка замедленного коксования: Чем выше температура и ниже давление, тем место разрыва углеродной цепи всё больше смещается к её концу и значительно возрастает...
Основы обеспечения единства измерений: Обеспечение единства измерений - деятельность метрологических служб, направленная на достижение...
Интересное:
Финансовый рынок и его значение в управлении денежными потоками на современном этапе: любому предприятию для расширения производства и увеличения прибыли нужны...
Средства для ингаляционного наркоза: Наркоз наступает в результате вдыхания (ингаляции) средств, которое осуществляют или с помощью маски...
Национальное богатство страны и его составляющие: для оценки элементов национального богатства используются...
Дисциплины:
|
из
5.00
|
Заказать работу |
Содержание книги
Поиск на нашем сайте
|
|
|
|
С++ предоставляет огромное количество способов для точного регулирования доступа к членам класса. Одним из таких способов является объявление производного класса. В наших примерах мы использовали объявление типа:
class manager: public employee
которое представлено в примере EMPLOY.
Что же дает слово public в этом утверждении и имеет ли оно альтернативу? Ключевое слово public определяет, что объект производного класса может иметь доступ к методам базового класса, объявленным как public. Альтернативой является ключевое слово private. При его использовании для объектов производного класса нет доступа к методам базового класса, объявленным как public. Поскольку для объектов нет доступа к членам базового класса, объявленным как private или protected, то результатом будет то, что для объектов производных классов не будет доступа ни к одному из членов базового класса.
Комбинации доступа
Существует очень много возможностей для доступа, и полезно будет изучить программу примера, показывающую, какая комбинация будет работать, а какая нет. Рассмотрим листинг программы PUBPRIV:
// pubpriv.срр
// испытание классов наследованных как public и private
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class A // базовый класс
{
private: // тип доступа к данным совпадает с типом
int privdataA; // доступа к функциям protected:
int protdataA;
public:
int pubdataA;
};
///////////////////////////////////////////////////////////
class В: public A // public наследование
{
public: void funct () {
int а;
//а = privdataA; // ошибка, нет доступа
//а = protdataA; // так можно
а = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
class C: private A // private наследование
{
public: void funct () {
int a;
//a = privdataA; // ошибка, нет доступа
//a = protdataA; // так можно
a = pubdataA; // так можно
}
};
///////////////////////////////////////////////////////////
int main ()
{
int а;
В objB;
//а = objB.privdataA; // ошибка, нет доступа
//а = objB.protdataA; // ошибка, нет доступа
а = objB.pubdataA; // так можно
C objC;
//а = objC.privdataA; // ошибка, нет доступа
//а = objC.protdataA; // ошибка, нет доступа
//а = objC.pubdataA; // ошибка, нет доступа
return 0;
}
В программе описан класс А, имеющий данные со спецификаторами доступа private, public и protected. Классы В и С являются производными классами. Класс В является общим наследником, а класс С — частным наследником от класса А.
Как мы видели ранее, методы производных классов имеют доступ к данным базового класса, объявленным как public или protected. Для объектов производных классов нет доступа к членам базового класса, объявленным как protected или private.
Что нового в различиях между общими и частными производным и классами? Объекты общего наследника класса В имеют доступ к членам класса А, объявленным как public или protected, а объекты частного наследника класса С имеют доступ только к членам, объявленным как public. Это показано на рис. 9.7.
Если не указывать спецификатор доступа при создании класса, то будет использован спецификатор private.
Уровни наследования
Производные классы могут являться базовыми классами для других производных классов. Рассмотрим маленькую программу в качестве примера такого случая.
class А { }:
class В: public А
class С: public В { }:
Здесь класс В является производным класса А, а класс С является производным класса В. Процесс может продолжаться бесконечно — класс D может быть производным класса С и т. д.
Рассмотрим более конкретный пример. Предположим, что мы решили добавить бригадиров в программу EMPLOY. Мы создадим новую программу, включающую в себя объекты класса foreman.
Класс foreman будет производным класса laborer. Это показано на рис. 11.1.

Рис. 11.1. UML диаграмма классов программы EMPLOY2
Бригадир наблюдает за выполнением работ, контролируя группу рабочих, и отвечает за выполнение нормы выработки своей группой. Эффективность работы бригадира измеряется в процентах выполнения нормы выработки. Поле quotas класса foreman представляет собой этот процент. Далее рассмотрим листинг программы EMPL0Y2:
// employ2.cpp
// несколько уровней наследования
#include <iostream>
using namespace std;
const int LEN = 80;
///////////////////////////////////////////////////////////
class employee // некий сотрудник
{
char name[LEN]; // имя сотрудника
unsigned long number; // номер сотрудника
public: void getdata () {
cout << "\n Введите фамилию: ";
cin >> name;
cout << " Введите номер: ";
cin >> number;
}
void putdata () const {
cout << "\n Фамилия: " << name;
cout << "\n Номер: " << number;
}
};
///////////////////////////////////////////////////////////
class manager: public employee // менеджер
{
private:
char title[LEN ]; // должность, например вице-президент
double dues; // сумма взносов в гольф-клуб
public:
void getdata () {
employee::getdata ();
cout << " Введите должность: ";
cin >> title;
cout << " Введите сумму взносов в гольф-клуб: ";
cin >> dues;
}
void putdata () const {
employee::putdata ();
cout << "\n Должность: " << title;
cout << "\n Сумма взносов в гольф-клуб: " << dues;
}
};
///////////////////////////////////////////////////////////
class scientist: public employee // ученый
{
private:
int pubs; // количество публикаций
public: void getdata () {
employee::getdata ();
cout << " Введите количество публикаций: ";
cin >> pubs;
}
void putdata () const {
employee::putdata ();
cout << "\n Количество публикаций: " << pubs;
}
};
///////////////////////////////////////////////////////////
class laborer: public employee // рабочий
{
};
///////////////////////////////////////////////////////////
class foreman: public laborer // бригадир
{
private:
float quotas; // норма выработки
public:
void getdata () {
laborer::getdata ();
cout << " Введите норму выработки: ";
cin >> quotas;
}
void putdata () const {
laborer::putdata ();
cout << "\n Норматив: " << quotas;
}
};
///////////////////////////////////////////////////////////
int main ()
{
laborer l1;
foreman f1;
// введем информацию о нескольких сотрудниках
cout << endl;
cout << "\nВвод информации о первом рабочем";
l1.getdata ();
cout << "\nВвод информации о первом бригадире";
f1.getdata ();
// выведем полученную информацию на экран
cout << endl;
cout << "\nИнформация о первом рабочем";
l1.putdata();
cout << "\nИнформация о первом бригадире";
f1.putdata ();
cout << endl;
return 0;
}
Заметим, что иерархия классов отлична от схемы организации. На схеме организации показаны линии команд. Результатом иерархии классов является обобщение схожих характеристик. Чем более общим является класс, тем выше он находится в схеме. Таким образом, рабочий — это более общая характеристика, чем бригадир, который имеет определенные обязанности. Поэтому класс Laborer показан над классом foreman в иерархии классов, хотя бригадир, скорее всего, имеет большую зарплату, чем рабочий.
Множественное наследование
Класс может быть производным не только от одного базового класса, а и от многих. Этот случай называется множественным наследованием. На рис. 11.2 показан случай, когда класс С является производным двух классов: А и В.
Синтаксис описания множественного наследования похож на синтаксис простого наследования. В случае, показанном на рис. 11.2, выражение будет выглядеть следующим образом:
class А class В
class С: public A, public В
Базовые классы класса С перечислены после двоеточия в строке описания класса и разделены запятыми.

Рис. 11.2. Диаграмма классов UML при множественном наследовании
|
|
|
Семя – орган полового размножения и расселения растений: наружи у семян имеется плотный покров – кожура...
Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...
© cyberpedia.su 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!