АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

КОНСТРУКТОРИ ПОХІДНОГО КЛАСУ._____________________________________

Читайте также:
  1. КОНСТРУКТОРИ І ДЕСТРУКТОРИ ПОХІДНИХ КЛАСІВ._______________________________
  2. УСПАДКОВУВАННЯ. ВИЗНАЧЕННЯ ПОХІДНОГО КЛАСУ._____________________________
Це потенційна проблема в програмі COUNTEN. Що буде, якщо ми захочемо ініціалізувати значенням об'єкт класу COUNTDN? Чи зможемо ми скористатися конструктором класу Counter з одним аргументом? Відповідь буде негативною. Як ми бачили в програмі Counten компілятор використовуватиме конструктор базового класу без аргументів. Ми повинні написати новий конструктор для похідного класу. Це показано про програму Counten 2:
 
// counten2.cpp - Конструктори в похідних класах #include <iostream> using namespace std; //---------------------------------------------- class Counter { protected: unsigned int count; // лічильник
 
  public: Counter C): count () { } // Конструктор без параметрів Counter (int c): count { c } {} // Конструктор з одним параметром unsigned int get_count () const // получення знaчення { return count:} Counter operator++ () // оператор збільшення { return Counter (++count); } }; //---------------------------------------------- class CountDn; public Counter { public: CountDn (): Counter () // Конструктор без параметрів { } CountDn (int C): Counter (c) // Конструктор з одним параметром CountDn operator -- () // оператор зменшення { return CountDn (-- count); } }; //--------------------------------- головна програма int main () CountDn c1; // змінні класу CountDn CountDn c2 (100); cout << "\n c1 = " << c1.get_count (); cout << "\n c2 = " << c2.get_count (); ++c1; ++c1; ++c1; cout << "\n c1 = " << c1.get_count (); --c2; --c2: cout << "c2 = " << c2.get_count (); CountDn c3 = --c2; cout << "\n c3 = " << c3.get__count (); cout << endl; return 0; }
 
 
 
Програма використовує два нові конструктори класу COUNTDN. Це конструктор без аргументів: COUNTDN (): Counter () { }
 

У цьому конструкторі використана нова для нас можливість: ім'я функції, наступне за двокрапкою. Вона використовується конструктором класу COUNTDN для виклику конструктора Counter() базового класу.

Коли ми запишемо у функції main() COUNTDN с1:

компілятор створить об'єкт класу COUNTDN і викличе конструктор класу Counter для його ініціалізації. Конструктор у свою чергу викличе конструктор класу Counter, який виконає потрібні дії. Конструктор COUNTDN() може виконувати і свої операції, окрім виклику іншого конструктора, в нашому випадку це не потрібно, тому простір між дужками порожній.

Виклик конструктора в списку ініціалізації може бути зайвим, але це має сенс. Ми хочемо ініціалізувати поле, не важливо, належить воно базовому або похідному класу, і перед виконанням будь-якого оператора програми спочатку будуть виконані операції конструктора. У рядку COUNTDN c2 (100); функції main() використовується конструктор класу COUNTDN з одним аргументом. Цей конструктор викликає відповідний конструктор з одним аргументом з базового класу:

COUNTDN (int c): Counter (c) // параметр C передається в конструктор класу Counter

Така конструкція означає, що аргумент С буде переданий від конструктора COUNTDN() у Counter(), де буде використаний для ініціалізації об'єкту.

У функції main() після ініціалізації об'єктів с1 і с2 ми збільшуємо один з них і зменшуємо інший, а потім виводимо результат. Конструктор з одним аргументом також використовується у виразах привласнення:

COUNTDN сз = --c2:

Підсумок заняття:

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

На даному занятті ми визначили такі основні концепції:

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

Ø Для ініціалізації елементів похідного класу ваша програма повинна викликати конструктори базового і похідного класів.

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

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

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

 

 

Домашня робота:

Додати бригадирів в програму emloyee. Створити нову програму, що включає об'єкти класу foreman.

Клас foreman буде похідним класу laborer. Це показано на мал.

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)