МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах
РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ" ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах Гендерна антидискримінаційна експертиза може зробити нас моральними рабами ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів Контакти
Тлумачний словник |
|
|||||||
Віртуальні методиРобота з об’єктами найчастіше робиться через покажчики. Покажчикові на базовий клас можна привласнити значення адреси об'єкта будь-якого похідного класу, наприклад: // Описується покажчик на базовий клас: 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); Розглянемо правила опису і використання віртуальних методів. · Якщо в базовому класі метод визначений як віртуальний, метод, визначений у похідному класі з тим же ім'ям і набором параметрів, автоматично стає віртуальним, а з набором параметрів - звичайним.
Чисто віртуальний метод містить ознаку = 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 — у даному значенні всього-на-всього «фактичний», тобто посилання дозволяється по факту виклику).
|
||||||||
|