Підсумок. Віртуальні функції дозволяють розв’язувати безпосередньо в процесі виконання програми, яку саме функцію викликати
Віртуальні функції дозволяють розв’язувати безпосередньо в процесі виконання програми, яку саме функцію викликати. Без їх використання це рішення приймається на етапі компіляції програми. Віртуальні функції дають більшу гнучкість при виконанні однакових дій над різнорідними об’єктами. Зокрема, вони дозволяють використання функцій, що викликаються з масиву вказівників на базовий клас, що насправді містить вказівники на породжені класи. Це приклад поліморфізму. Звичайно функція оголошується віртуальною в базовому класі, а інші функції з тим самим іменем оголошуються в породжених класах.
Використання принаймні однієї чистої віртуальної функції робить клас, що її містить, абстрактним. Це означає, що за допомогою цього методу не можна створювати ніяких об’єктів.
Дружня функція має доступ до прихованих даних класу, по відношенню до якого вона оголошена дружньою. Це буває корисним, якщо одна функція повинна мати доступ до двох не зв’язаних між собою класів і коли перезавантажувана операція повинна використовувати дані «чужого» класу, методом якого вона не є. Дружність також використовується для спрощення запису функцій.
Статичною називається функція, що працює з класом в цілому, а не з його окремими об’єктами. Зокрема, вона може обробляти статичні змінні. Вона може бути викликана з використанням імені класу і оператора явного задання функції.
Оператор присвоювання = може бути перезавантаженим. Це необхідно, коли він повинен виконувати більш складну роботу, ніж просте копіювання вмісту одного об’єкту в інший. Конструктор копіювання, що створює копії об’єктів під час ініціалізації, також може бути перезавантаженим. Це необхідно, коли він повинен виконувати складнішу роботу, ніж просте копіювання об’єкту.
Вказівник this може використовуватися в функції для вказування на об’єкт, чиїм методом він є. Він корисний, якщо в якості результату повертається об’єкт, чиїм методом є дана функція.
Питання по темі
1. Чи істинне твердження: вказівник на базовий клас може посилатися на об’єкти породженого класу ?
а) так
б) ні
2. Нехай вказівник р посилається на об’єкти базового класу і містить адресу об’єктів породженого класу. Нехай в обох цих класах міститься невіртуальний метод ding(). Тоді вираз p->ding() поставить на виконання версію функції з ___________ класу
а) базового
б) породженого
3. Нехай вказівник р посилається на об’єкти базового класу і містить адресу об’єктів породженого класу. Нехай в обох цих класах міститься віртуальний метод ding(). Тоді вираз p->ding() поставить на виконання версію функції з ___________ класу
а) базового
б) породженого
4. Написати описувач для віртуальної функції dang(), що повертає результат типу void і має аргумент типу int
а) virtual void dang(int);
б) virtual dang(int);
в) void dang(int); virtual;
5. Написати описувач для чистої віртуальної функції dang(), що повертає результат типу void і має аргумент типу int
а) virtual void dang(int)=0;
б) virtual dang(int);
в) void dang(int); virtual;
6. Чиста віртуальна функція – це віртуальна функція, яка:
а) робить свій клас абстрактним
б) не повертає результату
в) не має аргументів
7. Абстрактний клас в С++ використовується, коли:
а) не планується створювати породжені класи
б) ми хочемо відкласти визначення класу
в) з його допомогою заборонено створювати будь-які об’єкти
8. Як написати означення масиву parr, що містить 10 вказівників на об’єкти класу dong?
а) dong* parr[10];
б) dong *parr[10];
в) dong parr*[10];
9. Який метод базового класу слід робити віртуальним?
а) конструктор
б) деструктор
10. Чи істинне твердження: дружня функція має доступ до прихованих даних класу, не будучи його методом?
а) так
б) ні
11. Як написати описувач дружної функції func(), що повертає результат типу void і має аргумент типу float?
а) void func(float); friend;
б) friend void func(float);
в) friend func(float);
12. Написати описувач, який в тому класі, де він з’явиться, зробить кожен метод класу klass дружньою функцією
а) class klass; friend:
б) klass friend class;
в) friend class klass;
13. Статична функція:
а) повинна викликатися при виклику об’єкта
б) дуже зв’язана з індивідуальним об’єктом класу
в) може бути викликана з використанням імені класу та імені функції
14. Як правильно написати описувач перезавантажуваної операції присвоювання для класу zeta?
а) operator =(zeta)
б) zeta operator =(zeta)
в) zeta& operator =(zeta&)
15. Операції, виконувані оператором присвоювання і конструктором копіювання:
а) схожі, за винятком того, що конструктор копіювання створює новий об’єкт
б) схожі, за винятком того, що оператор присвоювання копіює компонентні дані
16. Як правильно написати описувач конструктора копіювання для класу zeta?
а) zeta(zeta)
б) zeta(zeta&)
в) operator zeta(zeta)
17. Конструктор копіювання запускається, коли:
а) функція повертається за значенням
б) функція повертається за посиланням
в) аргумент передається за значенням
г) аргумент передається за посиланням
18. Чи відрізняється дія таких виразів
person p1(p0)
person p1=p0
а) так
б) ні
19. Якщо в заданому класі змінна da є компонентними даними, то як правильно присвоїти значення 3 змінній da, використовуючи this?
а) this->da=3;\
б) this.da=3;
в) this*.da=3;
20. Як правильно написати вираз, за допомогою якого функція може повертати весь об’єкт, методом якого вона є, без створення тимчасових об’єктів?
а) return this
б) return *this;
в) return()
Дата добавления: 2015-08-26; просмотров: 758;