Ієрархія класів

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

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

Приклад нашої програми починається з опису базового класу employce. Цей клас містить прізвища працівників та їх номери. Він породжує три нових класи: manager, scientist і laborer.

Далі приведено лістінг програми 17.6, яка й реалізує всі ці класи

#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<<”\nПосада=”;cin>>title;

cout<<”\nВнески=”;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<<»\nPublications=»<<puts;

}

};

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

class laborer:public employce

{

};

//////////

int main()

{clrscr();

manager m1,m2;

scientist s1;

laborer l1;

//Vvid

cout<<endl;

cout<<”Менеджер 1\n”;

m1.getdata();

cout<<”Менеджер 2\n”;

m2.getdata();

cout<<”\nВчений 1”;

s1.getdata();

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

l1.getdata();

//Вивід

cout<<”\n\nM1”<<endl;

m1.putdata();

cout<<”\n\nM2”<<endl;

m2.putdata();

cout<<”\n\nS1”<<endl;

s1.putdata();

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

l1.putdata();

 

 

bioskey(0);

return 0;

}

Програма 17.6

 

В функції main() цієї програми оголошені 4 об’єкти різних класів: два об’єкти класу manager, об’єкт класу scientist та об’єкт класу laborer. Вони викликають метод getdata() для одержання даних і метод putdata() для її виведення.

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

 

Абстрактний базовий клас

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

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

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

 








Дата добавления: 2015-08-26; просмотров: 1074;


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

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.006 сек.