Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Топ:
Комплексной системы оценки состояния охраны труда на производственном объекте (КСОТ-П): Цели и задачи Комплексной системы оценки состояния охраны труда и определению факторов рисков по охране труда...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Интересное:
Аура как энергетическое поле: многослойную ауру человека можно представить себе подобным...
Принципы управления денежными потоками: одним из методов контроля за состоянием денежной наличности является...
Лечение прогрессирующих форм рака: Одним из наиболее важных достижений экспериментальной химиотерапии опухолей, начатой в 60-х и реализованной в 70-х годах, является...
Дисциплины:
2020-05-08 | 217 |
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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!