Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
первая часть.doc
Скачиваний:
22
Добавлен:
07.02.2016
Размер:
2.19 Mб
Скачать

Множинне спадкування

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

class monstr{

public: int get_health();

....

};

class hero{

public: int get_health();

...

};

class ostrich: public monstr, public hero{

};

int main(){

ostrich A;

cout << A.monstr::get_health();

cout << A.hero::get_health();

}

Як видно з приклада, для виклику методу get_health потрібно явно вказувати клас, у якому він описаний. Використання звичайної для виклику методу класу конструкції A.get_hea1th() приведе до помилки, оскільки компілятор не в змозі розібратися, до методу якого з базових класів потрібно звернутися.

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

class monstr{

};

class daemon: virtual public monstr{

}:

class lady: virtual public monstr{

};

class baby: public daemon, public lady{

};

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

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

Відмінності структур і об'єднань від класів.

Структури (struct) і об'єднання (union) являють собою окремі випадки класів.

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

Відмінності об'єднань від класів перераховані нижче:

  • доступ в об'єднаннях за замовчуванням public, крім того, у них узагалі не можна явно використовувати специфікатори доступу;

  • об'єднання не може брати участь в ієрархії класів;

  • елементами об'єднання не можуть бути об'єкти, що містять конструктори і деструктори;

  • об'єднання може мати конструктор і інші методи, тільки не статичні;

  • в анонімному об'єднанні не можна описувати методи.

Контрольні питання.

  1. Дати визначення процесу спадкування.

  2. Що таке ієрархія класів, як вона будується.

  3. Як оголосити базовий клас.

  4. Як оголосити похідний клас.

  5. Навести приклади спадкування класів.

Варіанти завдань роботи.

Варіант 1.

Створити клас CFile, інкапсулюючий у собі такі функції роботи з файлами, як Open, Close, Seek, Read, Write, GetPosition, GetLength. На базі цього класу створити похідний клас CMyDataFile - файл, що містить у собі дані деякого визначеного типу MeData, а також заголовок, що полегшує доступ до цього файлу. Написати програму, що демонструє роботу з цими класами. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класів.

Варіант 2.

Створити клас CPoint – крапка. На його основі створити класи CcoloredPoint і Cline. На основі класу Cline створити клас CColoredLine і CPolyLine – багатокутник. Усі класи повинні мати методи для установки й одержання значень усіх координат, а також зміни кольору й одержання поточного кольору. Написати демонстраційну програму, у якій буде використовуватися список об'єктів цих класів динамічної пам'яті.

Варіант 3.

Написати абстрактний клас CVehicle. На його основі реалізувати класи CPlane, CCar і CShip. Класи повинні мати можливість задавати й одержувати координати, параметри засобів пересування (ціна, швидкість, рік випуску). Для літака повинна бути визначена висота, для літака і корабля – кількість пасажирів. Для корабля – порт приписки. Написати програму, що створює список об'єктів цих класів у динамічній пам'яті. Програма повинна містити меню, що дозволяє здійснити перевірку всіх методів класів.

Варіант 4-24.

1. Описати базовий клас "Елемент".

Поля:

  • ім'я елемента (покажчик на рядок символів);

  • кількість входів елемента;

  • кількість виходів елемента;

Методи:

  • конструктор класу;

  • деструктор класу;

  • метод, що задає ім'я елемента.

2. На основі класу "Елемент" описати похідний клас "Комбінаційний", що представляє собою комбінаційний елемент (двоїчний вентиль), що може мати кілька входів і один вихід.

Поля:

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

Методи:

  • конструктор;

  • конструктор копіювання;

  • деструктор;

  • метод, що задає значення на входах екземпляра класу;

  • метод, що дозволяє опитувати стан окремого вхідного екземпляра класу;

  • метод, що обчислює значення виходу (по варіантові завдання).

3. На основі класу "Елемент" описати похідний клас "Пам'ять", що представляє собою тригер. Тригер має входи, що відповідають типу тригера (див. нижче варіант завдання), входи установки та входи для скидання. Усі тригери вважаються синхронними, сам синхровхід до складу тригера не включається.

Поля:

  • масив значень входів об'єкта класу (задається статично), у масиві враховуються усі входи (керуючі та інформаційні);

  • стан на прямому виході тригера;

  • стан на інверсному виході тригера.

Методи:

  • конструктор (за замовчуванням сбрасує екземпляр класу);

  • конструктор копіювання;

  • деструктор;

  • метод, що задає значення на входах екземпляра класу;

  • методи, що дозволяють опитувати стани окремого вхідного екземпляра класу;

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

  • метод, що перевизначає операцію == для екземплярів класу.

4. Створити клас "Регістр", використовуючи клас "Пам'ять" як включаємий клас.

Поля:

  • стан входу "Сброс" – один для екземпляра класу;

  • стан входу "Установка" – один для екземпляра класу;

  • статичний масив типу "Пам'ять" заданої у варіанті розмірності;

  • статичний(і) масив(и), що містять значення на відповідних входах елементів масиву типу "Пам'ять".

Методи:

  • метод, що задає значення на входах екземпляра класу (бажано як параметри передавати методові покажчики на масиви значень);

  • метод, що дозволяє опитувати стан окремого виходу екземпляра класу;

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

Всі поля класів "Елемент", "Комбінаційний" і "Пам'ять" повинні бути описані ключовим словом private або protected. У завданні описані тільки обов'язкові члени і методи класу. Можна задавати додаткові члени і методи, якщо вони не скасовують обов'язкові і забезпечують додаткові зручності при роботі з даними класами, наприклад, описати функції обчислення виходу/состоянія як віртуальні.

5. Для перевірки функціонування створених класів написати програму, що використовує ці класи. У програмі повинні бути продемонстровані всі властивості створених класів.

Конкретний тип комбінаційного елемента, тип тригера і розрядність регістра вибираються відповідно до варіанта завдання.

Варіант

Комбінаційний

елемент

Число

входів

Тригер

Розрядність регістра

1

І-НІ

4

RS

8

2

АБО

5

RST

10

3

МОД2-НІ

6

D

12

4

І

8

T

8

5

АБО-НІ

8

V

9

6

І

4

RS

10

7

АБО-НІ

5

JK

11

8

МОД2

5

D

8

9

І

4

T

10

10

АБО

3

JK

8

11

І-НІ

3

RS

12

12

АБО-НІ

4

RST

4

13

МОД2

5

D

10

14

МОД2-НІ

6

T

10

15

АБО-НІ

8

V

10

16

І

8

JK

6

17

І-НІ

8

RS

10

18

АБО

8

T

10

19

МОД2

6

JK

8

20

МОД2-НІ

5

V

10

Варіант 25.

Описати базовий клас РЯДОК.

Обов'язкові поля класу:

  • покажчик на char – зберігає адреса динамічно виділеної пам'яті для розміщення символів рядка;

  • значення типу int – зберігає довжину рядка в байтах.

Обов'язкові методи:

  • конструктор без параметрів;

  • конструктор, що приймає як параметр С-рядок (закінчується нульовим байтом);

  • конструктор, що приймає як параметр символ;

  • конструктор копіювання;

  • одержання довжини рядка;

  • очищення рядка (зробити рядок порожнім);

  • деструктор

Описати похідний від РЯДОК клас РЯДОК_ІДЕНТИФІКАТОР. Рядки даного класу будуються за правилами запису ідентифікаторів у мові С і можуть містити в собі тільки ті символи, що можуть входити до складу С-ідентифікаторів. Якщо вихідні дані суперечать правилам запису ідентифікатора, то створюється порожній РЯДОК_ ІДЕНТИФІКАТОР.

Обов'язкові методи:

  • конструктор без параметрів;

  • конструктор, що приймає як параметр С-рядок (закінчується нульовим байтом);

  • конструктор, що приймає як параметр символ;

  • конструктор копіювання;

  • переклад усіх символів рядка у верхній регістр;

  • переклад усіх символів рядка в нижній регістр;

  • пошук першого входження символу в рядок;

  • деструктор.

Перевизначити наступні операції:

  • присвоювання (=);

  • додавання (+) – операція конкатенації рядків;

  • віднімання (-) – з рядка (перший операнд) видаляються всі символи, що входять у рядок – другий операнд, при цьому може вийде порожній рядок;

  • операція (<) – перевірка на більше. Рядок вважається більше за інший, якщо код символу першого рядка в i-й позиції (i змінюється від 0 до n-1, де n- довжина більш короткого рядка) більше коду символу в тій же позиції в другому рядку, довжини рядків можуть не збігатися.

  • операція (>) – перевірка на менше. Рядок вважається меншим за інший, якщо код символу першого рядка в i-й позиції (i змінюється від 0 до n-1, де n- довжина більш короткого рядка) менше коду символу в тій же позиції в другому рядку, довжини рядків можуть не збігатися.

Розроблювач може вводити кожне (з обґрунтуванням необхідності) число додаткових полів і методів.

Написати текстову програму, що:

  • динамічно виділяє масив покажчиків на базовий клас (4-6);

  • у режимі діалогу заповнює цей масив покажчиками на похідні класи, при цьому екземпляри похідних класів створюються динамічно з завданням початкових значень;

  • для створення екземплярів похідних класів виконує перевірку всіх розроблених методів з виводом вихідних даних і результатів на екран (рекомендується використовувати статичні члени класу).

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

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