русс | укр

Мови програмуванняВідео уроки php mysqlПаскальСіАсемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование


Linux Unix Алгоритмічні мови Архітектура мікроконтролерів Введення в розробку розподілених інформаційних систем Дискретна математика Інформаційне обслуговування користувачів Інформація та моделювання в управлінні виробництвом Комп'ютерна графіка Лекції


Незмінність базового класу


Дата додавання: 2014-04-22; переглядів: 927.


Згадаємо, що при успадковуванні базисний клас залишається незмінним. В функції main() програми 11.1 ми визначили об’єкт типу Counter

Counter c2;

Такі об’єкти поводяться так, начебто клас CountOn не існує.

Зауважимо також, що успадковування не працює в зворотньому напрямку. Базовому класу і його об’єктам недоступні похідні класи. В нашому випадку це означає, що об’єкти типу Counter не можуть використовувати метод operator—() класу CountOn. Якщо ми хочемо мати можливість зменшувати лічильник, то об’єкт повинен бути класу CountOn.

 

Конструктори похідного класу

Це потенційна проблема програми 11.1. Що буде, якщо ми захочемо ініціалізувати значенням об’єкт класу CountOn? Чи зможемо ми скористатися конструктором базисного класу з одним аргументом? Відповідь буде заперечною. Для похідного класу слід написати власний конструктор. Зробимо це в програмі 11.2

#include <iostream.h>

#include <conio.h>

#include <bios.h>

class Counter

{protected:

unsigned int count;

public:

Counter():count(0) //конструктор

{ }

Counter (int c):count(с)

{ }

 

unsigned int get_count()

{return count;}

 

Counter operator++ ()

{return Counter(++count);

}

};

 

class CountOn:public Counter //похідний клас

{public:

CountOn():Counter()

{ }

CountOn(int c):Counter(с)

{ }

 

CountOn operator—()

{return CountOn(--count);

}

};

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

int main()

{

clrscr();

CountOn c1;

CountOn c2(100);

cout <<”\nc1=”<<c1.get_count();

cout <<”\nc2=”<<c2.get_count();

++c1;++c1;++c1;

cout <<”\nc1=”<<c1.get_count();

--c2;--c2;

cout <<”\nc1=”<<c1.get_count();

CountOn c3=--c2;

cout<<”\nc3=”<<c3.get_count();

cout <<endl;

bioskey(0);

return 0;

}

Програма 11.2

Програма використовує два нові конструктори класу CountOn. Це конструктор без аргументів

CountOn():Counter()

{ }

і конструктор з одним аргументом

CountOn(int c):Counter(с)

{ }

 

В першому конструкторі використана нова для нас можливість: ім’я функції після двокрапки. Вона використовується для виклику конструктора базового класу. Якщо ми запишемо в функції main()

 

CountOn c1;

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

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

Конструктор

CountOn(int c):Counter(с)

{ }

з одним аргументом викликає відповідний конструктор з одним аргументом з базового класу.

 


<== попередня лекція | наступна лекція ==>
Специфікатор доступу protected | Перезавантаження функцій


Онлайн система числення Калькулятор онлайн звичайний Науковий калькулятор онлайн