Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...
Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...
Топ:
Определение места расположения распределительного центра: Фирма реализует продукцию на рынках сбыта и имеет постоянных поставщиков в разных регионах. Увеличение объема продаж...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Процедура выполнения команд. Рабочий цикл процессора: Функционирование процессора в основном состоит из повторяющихся рабочих циклов, каждый из которых соответствует...
Интересное:
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Дисциплины:
2020-05-08 | 216 |
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-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!