Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Ключі доступу

При описі класу в його заголовку перелічуються всі класи, що є для нього базовими. Можливість звертання до елементів цих класів регулюється за допомогою ключів доступу private, protected і public:

class ім'я : [private | protected | public] базовий_клас

{ тіло класу };

Якщо базових класів не багато, вони перелічуються через кому. Ключ доступу може стояти перед кожним класом, наприклад:

class A { ... };

class В { ...};

class С { ... };

class D: A. protected В, public С {...};

За замовчуванням для класів використовується ключ доступу private, а для структур — public.

Щоб зрозуміти, як один клас може успадковувати інші, розглянемо приклад, що, незважаючи на свою простоту, ілюструє кілька ключових положень спадкування.

Для початку оголошення базового класу:

// Завдання базового класу

class В {

int i;

public:

void set_i(int n);

int get_і() ;

};

Тепер похідний клас, що успадковує цей базовий:

// Завдання похідного класу

class D:public В {

int j;

public:

void set_j(int n);

int mul();

};

Зверніть увагу, що в оголошенні після імені класу D є двокрапка, за яким рзташовано ключове слово public і ім'я класу В. Для компілятора це вказівка, що клас D буде успадковувати усі компоненти класу В. Саме ключове словоpublic інформує компілятор про те, що, оскільки В буде успадковуватися, значить усі відкриті елементи базового класу будуть також відкритими елементами похідного класу. Однак усі закриті елементи базового класу залишаються закритими, і до них немає прямого доступу з похідного класу. Нижче приводиться закінчена програма, у якій використовуються класи ВиD:

// Простий приклад спадкування.

#include <iostream.h>

// Завдання базового класу

class base {

int i;

public:

void set_i(int n);

int get_i();

};

// Завдання похідного класу

class derived:public base {

int j;

public:

void set_j(int n);

int mul();

};

// Установка значення і у базовому класі

void base::set_і(int n)

{

i=n;

}

// Повернення значення і у базовому класі

int base::get_i()

{

return i;

}

// Установка значення j у похідному класі

void derived::set_j(int n)

{

j = n;

}

// Повернення значення і з base та, одночасно, j з derived

int derived::mul()

{

// похідний клас може викликати функції-члени базового класу

return j*get i();

}

main ()

{

derived ob;

ob.set_і(10); // завантаження і у base

ob.set_j(4); // завантаження j у derived

cout « ob.mul(); // друк числа 40

return 0;

}

Зверніть увагу на визначенняmul(). Відзначте, що функціяget_i(), що є членом базового класуВ, а не похідногоD, викликається усередині класуD, без якого б не було зв'язку з яким-небудь об'єктом. Це можливо тому, що відкриті члени В стають відкритими членами D. У функціїmul(), замість прямого доступу доi, необхідно викликати get_i() через те, що закриті члени базового класу (у даному випадку i) залишаються закритими для неї і недоступними для будь-якого похідного класу. Причина, по якій закриті члени класу стають недоступними для похідних класів - підтримка інкапсуляції. Якби закриті члени класу ставали відкритими просто за допомогою спадкування класу, інкапсуляція була б зовсім неможливою. Тут показана загальна форма спадкування базового класу:

class ім'я_ похідного_ класу : специфікатор_доступу

ім'я_ базового_класу {

.

.

}

Тутспецифікатор _достуna — це одне з наступних трьох ключових слів: public (відкритий),private (закритий) абоprotected (захищений). У даному випадку для спадкування класу використовується самеpublic.

Дотепер ми розглядали тільки застосовувані до елементів класу специфікатори доступу private і рublіс. Для будь-якого елемента класу може також використовуватися специфікатор protected, котрий для одиночних класів, що не входять в ієрархію, рівносильний private. Різниця між ними виявляється при спадкуванні, це можна бачити з приведеної таблиці:

 

Ключ доступу Специфікатор у базовому класі Доступ у похідному класі
private private немає
  protected private
  public private
protected private немає
  protected protected
  public protected
public private немає
  protected protected
  public public

 

Як видно з таблиці, private елементи базового класу в похідному класі недоступні поза залежністю від ключа. Звертання до них може здійснюватися тільки через методи базового класу.

Елементи protected при спадкуванні з ключем private стають у похідному класі private, в інших випадках права доступу до них не змінюються.

Доступ до елементів рublіс при спадкуванні стає відповідним ключу доступу.

Якщо базовий клас успадковується з ключем private, можна вибірково зробити деякі його елементи доступними в похідному класі, оголосивши їх у секції public похідного класу за допомогою операції доступу до області видимості:

class Base{

...

public: void f();

};

class Derived : private Base{

...

public: Base::void f();

};




Переглядів: 1099

<== попередня сторінка | наступна сторінка ==>
ТЕОРЕТИЧНА ЧАСТИНА | Просте спадкування

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

  

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.003 сек.