Тема: успадкування. Одиночне успадкування. Керування доступом до елементів класу при успадкуванні. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Тема: успадкування. Одиночне успадкування. Керування доступом до елементів класу при успадкуванні.



Тема: Успадкування. Одиночне успадкування. Керування доступом до елементів класу при успадкуванні.

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

1. Мета наслідування.

2. Який клас називають базовим? похідним?

3. Що саме успадковує похідний клас? Що не успадковує?

4. Порівняйте відношення «is a» та «has a». Як такі відношення реалізуються на практиці?

5. Типи наслідування. Який тип наслідування працює по замовчуванню?

6. Як змінюється доступ до полів у похідному класі при різних типах наслідування?

7. Яка різниця між закритими та захищеними полями класу?

8. Порядок виклику конструкторів та деструкторів для об’єктів похідних класів.

9. Як використовується список ініціалізації у конструкторі похідного класу?

10. Що означає перевантаження методу у похідному класу? Перевизначення методу у похідному класі? Наведіть приклади.

11. Нехай А- базовий клас, В – похідний від нього. Кожен з класів має функцію void Show(). Яким чином можна викликати у методі Show() класу В метод Show() класу А?

12. Як у похідному класі відкрити доступ до полів(методів) з приватної частини базового класу?

13. Що відбувається у випадку присвоєння об’єкту базового класу об’єкта похідного класу? А навпаки?

14. Коли похідний клас повинен визначати присвоєння?

15. Знайдіть помилки у визначеннях класів.

а) class Car, public Vehicle { public: Car(); ~Car(); protected: int passengers; }   б) class SnowMobile: Vehicle { protected: int horsePower; double weight; public: SnowMobile(int h, double w), Vehicle(h) { horsePower = h; } ~SnowMobile(); };

 

Завдання 1.

Ship, CruiseShip, and CargoShip Classes

Design a Ship class that has the following members:

* A member variable for the name of the ship (a string)

* A member variable for the year that the ship was built (a string)

* A constructor and appropriate accessors and mutators

* A print function that displays the ship s name and the year it was built.

Design a CruiseShip class that is derived from the Ship class. The CruiseShip class

should have the following members:

* A member variable for the maximum number of passengers (an int)

* A constructor and appropriate accessors and mutators

* A print function that overrides the print function in the base class. The

CruiseShip class has print function should display only the ship s name and the

maximum number of passengers.

Design a CargoShip class that is derived from the Ship class. The CargoShip class

should have the following members:

* A member variable for the cargo capacity in tonnage (an int).

* A constructor and appropriate accessors and mutators.

* A print function that overrides the print function in the base class. The

CargoShip class s print function should display only the ship s name and the

ship s cargo capacity.

 

Додаткове завдання 2.

Визначити класи "Swordsman" (Мечник), "Archer" (Лучник) і "Mage" (Маг), кожен з яких є екземпляром базового класу "Unit" (штука, елемент) в комп'ютерній грі, і може атакувати, ухилятись від атак і вмирати.

У мечника 15 хіт-поінтів (життів), пошкодження при атаці 5, шанс ухилятись 60%.

Лучник: 12 hp, 4 dmg, 40% dodge

Маг: 8 hp, 10 dmg, 30% dodge

 

В main() створити два масива (ворогуючі сторони) по три юніта в кожному, причому тип юніта (мечник, лучник чи маг) має задаватись випадково, при заповненні цих масивів. Тобто один раз запустивши програму, може створитись три лучники проти мечника і двох магів, іншого - лучник, мечник і маг проти двох мечників і лучника і т.д.

 

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

 

В кінці бою оголосити, яка команда перемогла (перша/друга, синя/червона чи ін.)

 

Лабораторна робота № 2

Тема: Статичний та динамічний поліморфізм. Раннє та пізнє зв’язування. Віртуальні функції-елементи.

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

1. Статичне зв’язування.

2. Динамічне зв’язування.

3. Віртуальні функції. Який тип зв’язування забезпечують віртуальні функції?

4. Правила створення віртуальних методів.

5. У яких випадках необхідні віртуальні функції?

6. Чи можуть бути конструктори віртуальними? Деструктори?

7. Таблиця віртуальних функцій. Побудуйте таблицю віртуальних функцій для завдання 1.

8. Що буде виведено на екран в результаті роботи програми. Відповідь обґрунтуйте.

#include <iostream>

using namespace std;

class Base

{

protected:

int baseVar;

public:

Base(int val = 2)

{ baseVar = val; }

int getVar()

{ return baseVar; }

};

class Derived: public Base

{

private:

int derivedVar;

public:

Derived(int val = 100)

{ derivedVar = val; }

int getVar()

{ return derivedVar; }

};

int main()

{

Base *optr;

Derived object;

optr = &object;

cout << optr->getVar() << endl;

return 0;

9.

Завдання 1.

Удосконалити ієрархію класів завдання 1 Лаб роб 1(кораблі), використовуючи віртуальні функції-елементи. Створити масив вказівників на базовий клас(Ship), які проініціалізувати адресами динамічно створених об’єктів класів Ship, CruiseShip, CargoShip. Викликати функці-елементи друку(print()) для створених об’єктів. Результат пояснити.

 

Завдання 2.

Створити базовий клас Точка. Клас Точка повинен містити методи переміщення на площині. Створити класи плоских геометричних фігур Квадрат, Прямокутник, Трикутник. Ромб. Продумати ієрархію класів. Створити масив фігур(масив вказівників на базовий клас). Продемонструвати роботу системи класів.

Побудувати таблиці віртуальних функцій для створених класів.

 

Лабораторна робота № 4

Тема: Чисті віртуальні функції. Абстрактний базовий клас. Чистий віртуальний деструктор.

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

1. Яку функцію називають чистою віртуальною?

2. Різниця між віртуальними та чистими віртуальними функціями.

3. Який клас називають абстрактним? Особливості використання абстрактного класу.

4. Чи можна створити екземпляр абстрактного класу? Вказівник на абстрактний клас? Посилання на абстрактний клас?

5. Чи вірним є твердження, що всі функції в абстрактному базовому класі повинні бути оголошені як чисті віртуальні?

6. Мета створення абстрактних класів.

7. Віртуальні деструктори.

8. Коли необхідно використовувати віртуальні деструктори?

Завдання 1.

Виконати наступні зміни у ієрархії класів завдання 1 Лаб роб 3(кораблі):

o поля класів зробити динамічними (char*, int *);

o базовий клас Ship оголосити абстрактним;

o визначити віртуальні деструктори

o *визначити конструктори копії та оператори = для класів ієрархії.

Зауваження:

Конструктор копії похідного класу повинен у списку ініціалізації викликати конструктор копії базового класу: Derived(const Derived & obj): Base(obj){…}. Оператор = похідного класу повинен викликати оператор = базового класу для присвоєння полів, що успадковуються(Base:: operator=(obj)).

Створити масив вказівників на базовий клас(Ship), які проініціалізувати адресами динамічно створених об’єктів класів CruiseShip, CargoShip. Викликати функції-елементи друку(print()) для створених об’єктів. Видалити створені динамічно об’єкти та пояснити роботу деструкторів.

Перевірити неможливість створення екземпляра класу Ship. Пояснити доцільність використання віртуальних деструкторів.

 

Завдання 2.

Створити абстрактний базовий клас Shape, що містить:

o чисті віртуальні функції print(), printShapeName() – без реалізації

o віртуальні функції аrea(),volume(), що повертають нульове значення.

Клас Point успадковує реалізації аrea(),volume() від класу Shape (точка має нульову площу та об’єм). Клас Circle успадковує від класу Point реалізацію volume(), але має власну реалізацію аrea(). Клас Cylinder має власні реалізації функцій аrea() та volume().

Створити масив фігур(масив вказівників на базовий клас). Продемонструвати роботу системи класів.

 

 

Лабораторна робота 5

Тема: Простори імен. Операції перетворення типів static_cast<>, const>cast, reinterepret_cast<>, dynamic_cast<>. Операція RTTI typeid().

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

1. Мета створення та використання просторів імен.

2. Як створити простір імен? У якій точці програми можна визначити простір імен?

3. Що можна розмістити у просторі імен?

4. Як отримати доступ до імен простору імен?

5. Які імена називають некваліфікованими? Кваліфікованими?

6. Неіменовані простори імен. Особливості оголошення та використання.

7. Using –оголошення. Призначення.

8. Як працює using-оголошення, розміщене на локальному рівні? На глобальному рівні?

9. Наведіть приклад застосування using-оголошення у класах.

10. Порівняйте using-оголошення та using- директиву.

11. Як працює using-директива, розміщена на локальному рівні? На глобальному рівні?

12. Призначення бібліотеки RTTI.

13. Основні елементи RTTI.

14. Які операції перевантажені для класу typeinfo?

15. Що буде виведено на екран?

class Base {

public:

virtual void vvfunc() {}

};

class Derived: public Base {};

using namespace std;

int main() {

Derived* pd = new Derived;

Base* pb = pd;

cout << typeid(pb).name() << endl;

cout << typeid(*pb).name() << endl

cout << typeid(pd).name() << endl;

cout << typeid(*pd).name() << endl;

delete pd;

}

16. Операція dynamic_cast < >. Синтаксис. Можливість використання.

17. Поясніть результат роботи фрагмента коду:

class B {virtual void f();};

class D: public B {virtual void f();};

void f() {

B* pb = new D;

B* pb2 = new B;

 

D* pd = dynamic_cast<D*>(pb);

D* pd2 = dynamic_cast<D*>(pb2);

}

18. Призначення операції static_cast<>.

19. Призначення операції const_cast<>.

20. Призначення операції reinterepret_cast<>.

21. Протестуйте роботу функції f() для різних вказівників(B*, D*). Результати програми поясніть.

class B {

public:

virtual void Test(){}

};

class D: public B {};

 

void f(B* pb) {

D* pd1 = dynamic_cast<D*>(pb);

D* pd2 = static_cast<D*>(pb);

}

 

Завдання 1. У багатофайловому проекті(My.h, My.cpp, Main.cpp) довільної лаб. роботи розмістити визначення та реалізацію класу у деякому просторі імен.

 

Завдання 2. Вивести на екран кодову таблицю символів комп’ютера. Скористатися операцією static_cast<>.

 

Завдання 3. Навести приклад на використання операції const_cast<>.

 

Завдання 4. Навести приклад на використання операції reinterepret _cast<>.

Варіанти:

1) Перетворення вказівника у ціле число і навпаки

2) Перетворення 64-бітного цілого числа у структуру з 4-х коротких цілих(short) елементів і навпаки.

3) Перетворення 64-бітного беззнакового цілого числа у масив 8 символів і навпаки чи ін.).

4) Перетворення 64-бітного беззнакового цілого числа у масив беззнакових цілих і навпаки.

5) Присвоїти деякій цілій змінній адресу цієї ж змінної.

6) Перетворити структуру у масив символів потрібної довжини.

 

 

Завдання 5. Створити ієрархію класів Grandpa-> Daddy-> Son. Клас Grandpa має віртуальну функцію Sleep(). Класи Daddy та Son мають віртуальні функції Walk(). Клас Son має віртуальну функцію Play(). Створити масив вказівників на базовий клас. Визначити глобальну функцію, яка отримує масив вказівників на об’єкти та для кожного об’єкта викликає правильний набір віртуальних методів. Використати операцію dynamic_cast < >.

Завдання (додаткове).

Змінити правила бою у завданні 2 Лаб роботи №1 "Сутичка": кожен боєць (Воїн, Лучник чи Маг) повинен вишукувати серед ворогів суперника свого типу і атакувати його.

 

 

Лабораторна робота 6

Завдання 2.

Варіанти:

1. Визначити шаблон класу Stack, що будується на основі класу, визначеного у завданні 1. Шаблон класу Stack повинен емулювати роботу відповідного класу бібліотеки STL(stack).

2. Визначити шаблон класу Queue, що будується на основі класу, визначеного у завданні 1. Шаблон класу Queue повинен емулювати роботу відповідного класу бібліотеки STL(queue).

3. Визначити шаблон класу PriorityQueue, що будується на основі класу, визначеного у завданні 1. Шаблон класу PriorityQueue повинен емулювати роботу відповідного класу бібліотеки STL(priority _ queue).

4. Визначити шаблон класу Deque, що будується на основі класу, визначеного у завданні 1. Шаблон класу Deque повинен емулювати роботу відповідного класу бібліотеки STL(queue)/???

 

 

5. Визначити шаблон класу Set, що будується на основі класу BinTRee. Шаблон класу Set повинен емулювати роботу відповідного класу бібліотеки STL(set).

6. Визначити шаблон класу MultiSet, що будується на основі класу BinTRee. Шаблон класу MultiSet повинен емулювати роботу відповідного класу бібліотеки STL(multiset).

7. Визначити шаблон класу Map, що будується на основі класу BinTRee. Шаблон класу Map повинен емулювати роботу відповідного класу бібліотеки STL(map).

8. Визначити шаблон класу MultiMap, що будується на основі класу BinTRee. Шаблон класу MultiMap повинен емулювати роботу відповідного класу бібліотеки STL(multimap).

 

 

Лабораторна робота 9

Завдання 2

Виконати перше завдання для деякого текстового файлу. Результати виконання програми розмістити у другий текстовий файл.

Завдання 3. Створити масив кораблів(фігур чи ін.)на основі деякої ієрархії класів з віртуальними функціями. Записати масив у бінарний файл. Прочитати масив з файлу. Прочитати інформацію про елемент(корабель чи ін.) за номером(використати прямий доступ до файлу).

Лабораторна робота 12

Тема: Рядки у С++: клас string. Резидентні у пам’яті потоки.

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

 

Завдання 1. рядки

Завдання 2.потоки

Лабораторна робота 13

Завдання 1. вектор

Завдання 2.

Тема: Успадкування. Одиночне успадкування. Керування доступом до елементів класу при успадкуванні.

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

1. Мета наслідування.

2. Який клас називають базовим? похідним?

3. Що саме успадковує похідний клас? Що не успадковує?

4. Порівняйте відношення «is a» та «has a». Як такі відношення реалізуються на практиці?

5. Типи наслідування. Який тип наслідування працює по замовчуванню?

6. Як змінюється доступ до полів у похідному класі при різних типах наслідування?

7. Яка різниця між закритими та захищеними полями класу?

8. Порядок виклику конструкторів та деструкторів для об’єктів похідних класів.

9. Як використовується список ініціалізації у конструкторі похідного класу?

10. Що означає перевантаження методу у похідному класу? Перевизначення методу у похідному класі? Наведіть приклади.

11. Нехай А- базовий клас, В – похідний від нього. Кожен з класів має функцію void Show(). Яким чином можна викликати у методі Show() класу В метод Show() класу А?

12. Як у похідному класі відкрити доступ до полів(методів) з приватної частини базового класу?

13. Що відбувається у випадку присвоєння об’єкту базового класу об’єкта похідного класу? А навпаки?

14. Коли похідний клас повинен визначати присвоєння?

15. Знайдіть помилки у визначеннях класів.

а) class Car, public Vehicle { public: Car(); ~Car(); protected: int passengers; }   б) class SnowMobile: Vehicle { protected: int horsePower; double weight; public: SnowMobile(int h, double w), Vehicle(h) { horsePower = h; } ~SnowMobile(); };

 

Завдання 1.



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 357; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.190.156.80 (0.08 с.)