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


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


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


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


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


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


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


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


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


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



Лекція 18

Тема : Успадкування. Створення спадкоємних класів. Скриття, перекриття та успадкування методів та властивостей класу.

Мета об'єктно - орієнтованого програмування полягає в повторному використанні створених вами класів , що економить ваш час і сили. Якщо ви вже створили певний клас , то можливі ситуації , що новому класу потрібні багато або навіть усі особливості вже існуючого класу , і необхідно додати один або кілька елементів даних або функцій . У таких випадках C + + дозволяє вам будувати новий об'єкт , використовуючи характеристики вже існуючого об'єкта. Іншими словами , новий об'єкт буде успадковувати елементи існуючого класу ( званого базовим класом) . Коли ви будуєте новий клас з існуючого , цей новий клас часто називається похідним класом. У цьому уроці вперше вводиться наслідування класів в C + +. До кінця даного уроку ви вивчіть наступні основні концепції:

Їли ваші програми використовують спадкування , то для породження нового класу необхідний базовий клас , тобто новий клас успадковує елементи базового класу.
Для ініціалізації елементів похідного класу ваша програма повинна викликати конструктори базового і похідного класів .

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

На додаток до загальних ( public ) ( доступним всім) і приватним ( private ) ( доступним методам класу) елементам C + + надає захищені ( protected ) елементи , які доступні базовому і похідному класах .

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

Спадкування є фундаментальною концепцією об'єктно - орієнтованого програмування. Виберіть час для експериментів з програмами , представленими в цьому уроці . І ви виявите , що реально спадкування реалізується дуже просто і може зберегти величезні зусилля, витрачені на програмування .

ПРОСТЕ УСПАДКУВАННЯ

Спадкування являє собою здатність похідного класу успадковувати характеристики існуючого базового класу. Наприклад, припустимо , що у вас є базовий клас employee :

class employee

{
public :
employee ( char * , char * , float ) ;
void show_employee ( void ) ;
private :
char name [ 64 ] ;
char position [ 64 ] ;
float salary ;
} ;

 

Далі припустимо , що вашій програмі потрібно клас manager , який додає наступні елементи даних в клас employee :


float annual_bonus ;
char company_car [ 64 ] ;
int stock_options ;

 

У даному випадку ваша програма може вибрати два варіанти : по-перше , програма може створити новий клас manager , який дублює багато елементів класу employee, або програма може породити клас типу manager з базового класу employee . Породжуючи клас manager з існуючого класу employee , ви знижуєте обсяг необхідного програмування і виключаєте дублювання коду всередині вашої програми .

Для визначення цього класу ви повинні вказати ключове слово class , ім'я manager , наступне за ним двокрапку і ім'я employee , як показано нижче:

Похідний клас / / ----- > class manager : public employee { < ------- / / Базовий клас

/ / Тут визначаються елементи
} ;

Ключове слово public , яке передує ім'я класу employee , вказує , що загальні ( public ) елементи класу employee також є загальними і в класі manager . Наприклад , наступні оператори породжують клас manager .

class manager : public employee

{
public :
manager ( char * , char * , char * , float , float , int ) ;
void show_manager ( void ) ;
private :
float annual_bonus ;
char company_car [ 64 ] ;
int stock_options ;
} ;

 

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

Наступна програма MGR_EMP.CPP ілюструє використання спадкування в C + + , створюючи клас manager з базового класу employee :


# include <iostream.h>

# include <string.h>

class employee

{
public :
employee ( char * , char * , float ) ;
void show_employee ( void ) ;
private :
char name [ 64 ] ;
char position [ 64 ] ;
float salary ;
} ;

employee :: employee ( char * name , char * position , float salary )

{
strcpy ( employee :: name , name ) ;
strcpy ( employee :: position , position ) ;
employee :: salary = salary ;
}

void employee :: show_employee ( void )

{
cout << "Назва: " << name << endl ;
cout << " Посада: " << position << endl ;
cout << " Оклад : $ " << salary << endl ;
}

class manager : public employee

{
public :
manager ( char * , char * , char * , float , float , int ) ;
void show_manager ( void ) ;
private :
float annual_bonus ;
char company_car [ 64 ] ;
int stock_options ;
} ;

manager :: manager ( char * name , char * position , char * company_car , float salary , float bonus , int stock_options ) : employee ( name , position , salary )

{
strcpy ( manager :: company_car , company_car ) ;
manager :: annual_bonus = bonus ;
manager :: stock_options = stock_options ;
}

void manager :: show_manager ( void )

{
show_employee ();
cout << " Машина фірми: " << company_car << endl ;
cout << " Щорічна премія : $ " << annual_bonus << endl ;
cout << " Фондовий опціон : " << stock_options << endl ;
}

void main ( void )

{
employee worker ( "Джон Дой " , "Програміст " , 35000 ) ;
manager boss ( " Джейн Дой " , "Віце -президент" , "Lexus" , 50000.0 , 5000 , 1000) ;
worker.show_employee ();
boss.show_manager ();
}

 

Як бачите , програма визначає базовий клас employee , а потім визначає похідний клас manager . Зверніть увагу на конструктор manager . Коли ви породжує клас з базового класу , конструктор похідного класу повинен викликати конструктор базового класу. Щоб викликати конструктор базового класу , помістіть двокрапку відразу ж після конструктора похідного класу , а потім вкажіть ім'я конструктора базового класу з необхідними параметрами :


manager :: manager ( char * name , char * position , char * company_car , float salary , float bonus , int stock_options ) :
employee ( name , position , salary ) / / ------------- Конструктор базового класу

{
strcpy ( manager :: company_car , company_car ) ;
manager :: annual_bonus = bonus ;
manager :: stock_options = stock_options ;
}

 

Також зверніть увагу , що функція show_manager викликає функцію show_employee , яка є елементом класу employee . Оскільки клас manager є похідним класу employee , клас manager може звертатися до загальних елементів класу employee , як якщо б всі ці елементи були визначені усередині класу manager ,

Подання про спадкування

Спадкування являє собою здатність похідного класу успадковувати характеристики існуючого базового класу. Простими словами це означає , що , якщо у вас є клас , чиї елементи даних або функції - елементи можуть бути використані новим класом , ви можете побудувати цей новий клас в термінах існуючого (або базового ) класу. Новий клас у свою чергу буде наслідувати елементи ( характеристики ) існуючого класу. Використання успадкування для побудови нових класів заощадить вам значний час і сили на програмування . Об'єктно - орієнтоване програмування широко використовує спадкування , дозволяючи вашій програмі будувати складні об'єкти з невеликих легко керованих об'єктів.

другий приклад

Припустимо , наприклад , що ви використовуєте наступний базовий клас book середині існуючої програми :


class book

{
public :
book ( char * , char * , int ) ;
void show_book ( void ) ;
private :
char title [ 64 ] ;
char author [б 4];
int pages ;
} ;

 

Далі припустимо , що програмі потрібно створити клас library_card , який буде додавати наступні елементи даних в клас book :


char catalog [ 64 ] ;
int checked_out ; / / 1 , якщо перевірена , інакше Про

Ваша програма може використовувати спадкування , щоб породити клас library _card з класу book , як показано нижче:

class library_card : public book

{
public :
library_card ( char * , char * , int , char * , int ) ;
void show_card ( void ) ;
private :
char catalog [ 64 ] ;
int checked_out ;
} ;

 

Наступна програма BOOKCARD.CPP породжує клас library_card з клacca book :


# include <iostream.h>

# include <string.h>

class book

{
public :
book ( char * , char * , int ) ;
void show_book ( void ) ;
private :
char title [ 64 ] ;
char author [ 64 ] ;
int pages ;
} ;

book :: book ( char • title , char * author , int pages )

{
strcpy ( book :: title , title ) ;
strcpy ( book :: author , author ) ;
book :: pages = pages ;
}

void book :: show_book ( void )

{
cout << " Назва: " << title << endl ;
cout << " Автор : " << author << endl ;
cout << " Сторінок: " << pages << endl ;
}

class library_card : public book

{
public :
library_card ( char * , char * , int , char * , int ) ;
void show_card ( void ) ;
private :
char catalog [ 64 ] ;
int checked_out ;
} ;

library_card :: library_card ( char * title , char * author , int pages , char * catalog , int checked_out ) : book ( title , author , pages )

{
strcpy ( library_card :: catalog , catalog ) ;
library_card :: checked_out = checked_out ;
}

void 1ibrary_card :: show_card ( void )

{
show_book ();
cout << " Каталог : " << catalog << endl ;
if ( checked_out ) cout << " Статус: перевірена " << endl ;
else cout << " Статус : вільна " << endl ;
}

void main ( void )

{
library_card card ( "Вчимося програмувати на мові C + +" , " Jamsa " , 272 , " 101СРР " , 1);
card.show_card ();
}

 

Як і раніше , зверніть увагу , що конструктор library _card викликає конструктор класу book для ініціалізації елементів класу book . Крім того , зверніть увагу на використання функції -елемента show_book класу book всередині функції show_card . Оскільки клас library_card успадковує методи класу book , функція show_card може викликати цей метод ( show_book ) без допомоги оператора точки , як якщо б цей метод був методом класу library _card .

ЩО ТАКЕ ЗАХИЩЕНІ ЕЛЕМЕНТИ

При вивченні визначень базових класів ви можете зустріти елементи , оголошені як public , private і protected (загальні , приватні і захищені) . Як ви знаєте , похідний клас може звертатися до загальних елементам базового класу , як ніби вони визначені в похідному класі . З іншого боку , похідний клас не може звертатися до приватних елементів базового класу безпосередньо. Замість цього для звернення до таких елементів похідний клас повинен використовувати інтерфейсні функції . Захищені елементи базового класу займають проміжне положення між приватними і загальними. Якщо елемент є захищеним , об'єкти похідного класу можуть звертатися до нього , як ніби він є загальним . Для решти вашої програми захищені елементи є як би приватними . Єдиний спосіб , за допомогою якого ваші програми можуть звертатися до захищених елементів , полягає у використанні інтерфейсних функцій . Наступне визначення класу book використовує мітку protected , щоб дозволити класам , похідним від класу book , звертатися до елементів title , author і pages безпосередньо, використовуючи оператор крапку:


class book

{
public :
book ( char * , char * , int ) ;
void show_book ( void ) ;
protected :
char title [ 64 ] ;
char author [ 64 ] ;
int pages ;
} ;

 

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

Захищені елементи забезпечують доступ і захист

Як ви вже знаєте , програма не може звернутися безпосередньо до приватних елементів класу . Для звернення до приватних елементам програма повинна використовувати інтерфейсні функції , які управляють доступом до цих елементів . Як ви , мабуть, помітили , спадкування спрощує програмування в тому випадку , якщо похідні класи можуть звертатися до елементів базового класу за допомогою оператора точки . У таких випадках ваші програми можуть використовувати захищені елементи класу. Похідний клас може звертатися до захищених елементів базового класу безпосередньо, використовуючи оператор крапку. Однак частина, що залишилася вашої програми може звертатися до захищених елементів тільки за допомогою інтерфейсних функцій цього класу. Таким чином , захищені елементи класу знаходяться між загальними ( доступними всій програмі ) і приватними ( доступними тільки самому класу ) елементами .

ДОЗВІЛ КОНФЛІКТУ ІМЕН

Якщо ви породжує один клас з іншого , можливі ситуації , коли ім'я елемента класу в похідному класі є таким же , як ім'я елемента в базовому класі. Якщо виник такий конфлікт , C + + завжди використовує елементи похідного класу всередині функцій похідного класу . Наприклад, припустимо , що класи book і library_card використовують елемент price . У разі класу book елемент price відповідає продажній ціні книги , наприклад $ 22.95 . У разі класу library'_card price може включати бібліотечну знижку , наприклад $ 18.50 . Якщо у вашому початковому тексті не вказано явно (за допомогою оператора глобального дозволу) , функції класу library_card будуть використовувати елементи похідного класу { library_card ) . Якщо ж функціям класу library_card необхідно звертатися до елементу price базового класу { book ) , вони повинні використовувати ім'я класу book і оператор дозволу , наприклад book :: price . Припустимо , що функції show_card необхідно вивести обидві ціни . Тоді вона повинна використовувати наступні оператори :

cout << " Бібліотечна ціна: $ " << price << endl ;
cout << " Продажна ціна: $ " << book :: price << endl ;

 

ЩО ВАМ ТРЕБА ЗНАТИ

З цього уроку ви дізналися , що спадкування в C + + дозволяє вам будувати / породжувати ) новий клас з існуючого класу. Будуючи такий спосіб один клас з іншого , ви зменшуєте обсяг програмування , що , у свою чергу , заощаджує ваш час. З уроку 27 ви дізнаєтеся , що C + + дозволяє вам породжувати клас з двох або декількох базових класів . Використання декількох базових класів для породження класу представляє собою множинне спадкування .

Спадкування являє собою здатність виробляти новий клас з існуючого базового класу.

Похідний клас - це новий клас , а базовий клас - існуючий клас .

Коли ви породжує один клас з іншого ( базового класу) , похідний клас успадковує елементи базового класу.

Для породження класу з базового починайте визначення похідного класу ключовим словом class , за яким слідує ім'я класу , двокрапка і ім'я базового класу , наприклад class dalmatian : dog .

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

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

Щоб забезпечити похідним класам прямий доступ до певних елементів базового класу , в той же час захищаючи ці елементи від решти програми , C + + забезпечує захищені { protected ) елементи класу. Похідний клас може звертатися до захищених елементів базового класу , як ніби вони є спільними. Однак для решти програми захищені елементи еквівалентні приватним.

Якщо у похідному і базовому класі є елементи з однаковим ім'ям , то всередині функцій похідного класу C + + буде використовувати елементи похідного класу . Якщо функціям похідного класу необхідно звернутися до елементу базового класу , ви повинні використовувати оператор глобального дозволу , наприклад base class :: member .


Читайте також:

  1. Вид заняття: лекція
  2. Вид заняття: лекція
  3. Вид заняття: лекція
  4. Вид заняття: лекція
  5. Вид заняття: лекція
  6. Вступна лекція
  7. Вступна лекція 1. Методологічні аспекти технічного регулювання у
  8. Клітинна селекція рослин.
  9. Колекція фонограм з голосами осіб, які анонімно повідомляли про загрозу вибуху
  10. ЛЕКЦІЯ (4): Мануфактурний період світової економіки
  11. Лекція - Геополітика держави на міжнародній арені
  12. Лекція 02.04.2013




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

<== попередня сторінка | наступна сторінка ==>
Лекція 17 | Крок 1. Успадкування батьківських методів.

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

  

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


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