Общее и частное наследование — КиберПедия 

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Общее и частное наследование

2020-05-08 216
Общее и частное наследование 0.00 из 5.00 0 оценок
Заказать работу

С++ предоставляет огромное количество способов для точного регулирования доступа к членам класса. Одним из таких способов является объявление произ­водного класса. В наших примерах мы использовали объявление типа:

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 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.029 с.