Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Загальне і приватне успадковування

Поиск

С++ надає багато можливостей для точного редагування доступів до членів класу. Одним з таких способів є оголошення похідного класу. В наших прикладах ми використовували оголошення типу

class manage: public employce;

Що дає нам слово public в цьому твердженні і чи має воно альтернативу? Ключове слово public визначає, що об’єкт похідного класу може мати доступ до методів базового класу, оголошених як public. Альтернативою є ключове слово private. При його використанні для об’єктів похідного класу нема доступу до членів базового класу.

 

Комбінації доступу

Існує багато можливостей для доступу. Приведемо приклад, що показує, яка комбінація буде працювати, а яка – ні. Далі приведено лістінг програми 11.7

 #include<iostream.h>

 #include<conio.h>

 #include<stdio.h>

 #include<bios.h>

 class A

 {private:

 int privdataA;

 protected:

 int protdataA;

 public:

 int pubdataA;

 };

 /////////////

 class B:public A

 {public:

 void funcs()

 {int a;

// a=privdataA; помилка

 a=protdataA;

 a=pubdataA;

 }

 };

///////////

class C:private A

{public:

void funct()

{int a;

 //a=privdataA; // помилка

 a=protdataA;

 a=pubdataA;

}

};

 ///////////

 int main()

 {clrscr();

 int a;

 B objB;

// a=objB.privdataA;//помилка

// a=objB.protdataA;//помилка

 a=objB.pubdataA;

 

C objC;

// a=objC.privdataA;//помилка

// a=objC.protdataA;//помилка

// a=objC.pubdataA; //помилка

 bioskey(0);

 return 0;

 }

Програма 11.7

В програмі описаний клас А, що має дані зі специфікаторами доступу private, public, protected. Клас В і С є похідними класами. Клас В є загальним спадкоємцем, клас С – приватним спадкоємцем класу А. Методи похідних класів мають доступ до даних базового класу, оголошений як public чи protected. Для об’єктів похідних класів відсутній доступ до членів базового класу, оголошених як protected чи private.

Що нового у відмінностях між загальними і приватними похідними класами? Об’єкти загального спадкоємця В мають доступ до членів класу А, оголошених як public чи protected, а об’єкти приватного спадкоємця класу С мають доступ лише до членів, оголошених як private.

Якщо не вказувати специфікатор доступу при створенні класу, то буде використаний специфікатор private.

 

Вибір специфікаторів доступу

Не завжди очевидно, який специфікатор використовувати при успадковуванні. Переважно похідний клас являє собою покращену чи більш спеціалізовану версію базового класу, як це є у всіх наших попередніх прикладах. У випадку, коли об’єкт похідного класу надає доступ як до більш загальних методів базового класу, так і до спеціальніших методів похідного класу, краще обійтися загальним успадковуванням.

Але в деяких випадках похідний клас створюється для повної модифікації дій базового класу, приховуючи чи дуже змінюючи його первісний вигляд, при цьому ряд методів базового класу взагалі хочемо «закрити», заборонивши їх використання. В цьому випадку можна скористатися приватним успадковуванням.

 

Рівні успадковування

Похідні класи можуть виступати як базові класи для інших похідних класів. Розглянемо маленьку програму як приклад такого випадку:

class A

{ };

class B:public A

{ };

class c:public B

{ }

Тут клас В є похідним класу А, а клас С – похідним класу В. Процес може розвиватися далі.

Розглянемо конкретніший приклад. Припустімо, що ми хочемо ввести в організації (програма 11.7) посаду бригадира. Відповідний клас називатиметься foreman, базуватиметься на класі laborer і міститиме порівняно з цим класом додаткове поле «процент виконання норми виробітку».

Далі приведений лістінг програми 11.8.

 #include<iostream.h>

 #include<conio.h>

 #include<stdio.h>

 #include<bios.h>

 const int LEN=80;

 ////////////

 class employce

 {private:

 char name[LEN];

 unsigned long number;

 public:

 void getdata()

 {cout <<”\nВведіть ПІП: “;cin>>name;

 cout <<”\nВведіть номер: “;cin>>number;

 }

 void putdata() const

 {cout<<”\nПІП=”<<name;

 cout<<”\nНомер=”<<number;

 }

 };

 class manager:public employce

 {private:

 char title[LEN];

 double dues;

 public:

 void getdata()

 {employce::getdata();

 cout<<”\nPosada=”;cin>>title;

 cout<<”\nVnesky=”;cin>>dues;

 }

 void putdata() const

 {employce::putdata();

 cout<<”\nПосада=”<<title;

 cout<<”\nВнески=”<<dues;

 }

 };

 //////////

 class scientist:public employce

 {private:

 int puts;

 public:

 void getdata()

 { employce::getdata();

 cout<<”\nПублікації=”;cin>>puts;

 }

 void putdata() const

 { employce::putdata();

 cout<<”\nПублікації=”<<puts;

 }

 };

 ////////////

 class laborer:public employce

 {

 };

 /////////

 class foreman:public laborer

 {private:

 double quotas;

 public:

 void getdata()

 {laborer::getdata();

 cout <<” Норма виробітку=”;cin>>quotas;

 }

void putdata() const

{laborer::putdata();

cout <<”\n Норма виробітку =”<<quotas;

}

 };

 //////////

 int main()

 {clrscr();

 laborer l1;

 foreman f1;

//Ввід

cout<<endl;

cout<<”\nРобітник 1”;

l1.getdata();

cout<<”\nБригадир 1”;

f1.getdata();

 

//Вивід

cout<<”\n\nl1”<<endl;

l1.putdata();

cout<<”\n\nf1”<<endl;

f1.putdata();

 

 bioskey(0);

 return 0;

 }

Програми 11.8

 

Множинне успадковування

Клас може бути похідним не тільки від одного базового класу, а й від багатьох. Цей випадок називається множинним успадковуванням. Синтаксис опису множинного успадковування схожий на випадок простого успадковування. Далі приведений приклад множинного успадковування:

class A

{ };

class B

{ };

clacc C:public A, public B

{ };

Базові класи класу С перелічені після двокрапки в рядку опису класу і розділені комами.

 



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 32; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.221.252 (0.006 с.)