Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Готове ООП.doc
Скачиваний:
6
Добавлен:
07.07.2019
Размер:
671.23 Кб
Скачать
  1. Поліморфізм віртуальних функцій.

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

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

  • Віртуальна функція є членом класу, а тому може викликатись як звичайна функція-член. Оголошується і визначається віртуальна функція як звичайна функція-член класу, але з модифікатором virtual. Для оголошення функції віртуальною використовується модифікатор virtual, але лише при декларації функції в тілі класу. Загальний синтаксис оголошення функції віртуальною є простим

  • virtual тип Ім'я_функції(список_аргументів) {тіло}

  • При реалізація віртуальної функції за межами класу другий раз модифікатор virtual не декларується, наприклад

  1. class A

  2. {

  3. public:

  4. virtual int GetInt(); // оголошення віртуальної функції

  5. };

  6. int A::GetInt(){return 1;} // наявність virtual є заявою

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

  • З метою поширення поліморфної поведінку функції по усій вітці наслідування кожен похідний клас повинен декларувати її віртуальною, а сама віртуальна функція переозначуватись в кожному похідному класі. У випадку відсутності модифікатора virtual при оголошенні віртуальної функції-члена принаймні в одному проміжного класі властивість поліморфізму переривається. З наступного класу поліморфну поведінку функції можна лише "зародити" знову.

  • При переозначенні віртуальної функції в похідному класі наявність модифікатора virtual є необов'язковою, оскільки він несе інформацію про віртуальність лише для наступного похідного класу.

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

  1. Параметризовані функції та класи.

Параметризовані класи

Визначаючи параметризований клас, ми створюємо його каркас (шаблон), що описує усі алгоритми, які використовуються класом. Фактичний тип даних, над яким проводитимуться маніпуляції, буде вказаний в якості параметру при конкретизації об'єктів цього класу. Компілятор автоматично згенерує відповідний об'єкт на основі вказаного типу. Загальна форма декларування параметризованого класу буде такою:

template <class Type> class class_name

{

// протокольна частина класу

}

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

У межах визначення класу шаблонне ім'я можна використовувати у будь-якому місці. Для створення конкретної реалізації використовується наступна форма:

class_name <type> ob;

У цьому випадку type представляє собою ім'я конкретного типу даних, над якими фактично оперуватиме клас, та замінює змінну Type. До речі, елементи-функції, над якими оперуватиме клас, автоматично стають параметризованими, тобто їх необов'язково декларувати за допомогою ключового слова template.

Параметризовані функції

Шаблон функції декларується за допомогою ключового слова template. Це слово використовується для створення шаблону (каркасу), що в загальних рисах описує призначення функції та надає опис операцій - сутність алгоритму, що може застосовуватися до даних різних типів. При цьому конкретний тип даних, над яким функція повинна виконувати операції, передаватиметься їй на етапі компіляції. Загальна форма функції-шаблону має вигляд:

Синтаксис:

temрlate <список_аргументів_шаблону> тип ім'я_функції(параметри)

{

// тіло функції

}

Список аргументів шаблону складається з ключового слова class та ідентифікатору (-ів), що визначає його тип. Коли компілятор створюватиме конкретну версію цієї функції, він автоматично замінить цей параметр конкретним типом даних. Цей процес носить назву інстанціювання шаблону.

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

template <class T> void funk(T array[ ], sizearray).