Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...
История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...
Топ:
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Техника безопасности при работе на пароконвектомате: К обслуживанию пароконвектомата допускаются лица, прошедшие технический минимум по эксплуатации оборудования...
Интересное:
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Влияние предпринимательской среды на эффективное функционирование предприятия: Предпринимательская среда – это совокупность внешних и внутренних факторов, оказывающих влияние на функционирование фирмы...
Дисциплины:
|
из
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 при множественном наследовании
|
|
|
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
Индивидуальные очистные сооружения: К классу индивидуальных очистных сооружений относят сооружения, пропускная способность которых...
Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...
© cyberpediasu.com 2017-2026 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!