Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Контакти
 


Тлумачний словник
Авто
Автоматизація
Архітектура
Астрономія
Аудит
Біологія
Будівництво
Бухгалтерія
Винахідництво
Виробництво
Військова справа
Генетика
Географія
Геологія
Господарство
Держава
Дім
Екологія
Економетрика
Економіка
Електроніка
Журналістика та ЗМІ
Зв'язок
Іноземні мови
Інформатика
Історія
Комп'ютери
Креслення
Кулінарія
Культура
Лексикологія
Література
Логіка
Маркетинг
Математика
Машинобудування
Медицина
Менеджмент
Метали і Зварювання
Механіка
Мистецтво
Музика
Населення
Освіта
Охорона безпеки життя
Охорона Праці
Педагогіка
Політика
Право
Програмування
Промисловість
Психологія
Радіо
Регилия
Соціологія
Спорт
Стандартизація
Технології
Торгівля
Туризм
Фізика
Фізіологія
Філософія
Фінанси
Хімія
Юриспунденкция






Віртуальні методи

Робота з об’єктами найчастіше робиться через покажчики. Покажчикові на базовий клас можна привласнити значення адреси об'єкта будь-якого похідного класу, наприклад:

// Описується покажчик на базовий клас:

monstr *р;

// Покажчик посилається на об'єкт похідного класу:

р = new daemon;

Виклик методів об'єкта відбувається відповідно до типу покажчика, а не за фактичним типом об'єкта, на який він посилається, тому при виконанні оператора, наприклад,

p->draw(1, 1, 1, 1);

буде викликаний метод класу monstr, а не класу daemon, оскільки посилання на методи дозволяються під час компонування програми. Цей процес називається раннім зв'язуванням. Щоб викликати метод класу daemon, можна використовувати явне перетворення типу покажчика:

(daemon * p)->draw(1, 1, 1, 1);

Це не завжди можливо, оскільки в різний час покажчик може посилатися на об'єкти різних класів ієрархії, і під час компіляції програми конкретний клас може бути невідомий. Як приклад можна навести функцію, параметром якої є покажчик на об'єкт базового класу. На його місце під час виконання програми може бути передано покажчик на будь-який похідний клас. Інший приклад – зв’язаний список покажчиків на різні об’єкти ієрархії, з яким потрібно працювати одночасно.

У C++ реалізовано механізм пізнього зв'язування, коли дозвіл посилань на метод відбувається на етапі виконання програми в залежності від конкретного типа об'єкта, що визвав цей метод. Цей механізм реалізовано за допомогою віртуальних методів і розглянуто далі.

Для визначення віртуального методу використовується специфікатор virtual, наприклад:

virtual void draw(int x, int y, int scale, int position);

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

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

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

Чисто віртуальний метод містить ознаку = 0 замість тіла, наприклад:

virtual void f(int) = 0;

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

Якщо визначити метод draw у класі monstr як віртуальний, рішення про те, метод якого класу викликати, буде прийматися в залежності від типу об'єкта, на який посилається покажчик:

monstr *r, *р;

г = new monstr; //Створюється об'єкт класу monstr

р = new daemon; //Створюється об'єкт класу daemon

r->draw(1, 1, 1, 1); //Викликається метод monstr::draw

p->draw(1, 1, 1, 1); //Викликається метод daemon::draw

р-> monstr::draw(1, 1, 1, 1); //Обхід механізму віртуальних методів

Якщо об'єкт класу daemon буде викликати метод draw не безпосередньо, а побічно (тобто з іншого методу, визначеного в класі monstr), буде викликаний метод draw класу daemon.

Отже, віртуальним називається метод, посилання на який дозволяється на етапі виконання програми (переклад красивого англійського слова virtual — у даному значенні всього-на-всього «фактичний», тобто посилання дозволяється по факту виклику).




Переглядів: 1320

<== попередня сторінка | наступна сторінка ==>
Просте спадкування | Механізм пізнього зв'язування

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

 

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.006 сек.