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

Віртуальний метод або віртуальна функція — метод об'єкта в об'єктно-орієнтованому програмуванні, різний для базового класу і класу нащадка.

Концепція віртуальної функції вирішує наступну проблему:

У ООП, якщо клас-нащадок наслідується від базового класу, об'єкт екземпляр класу-нащадка може використовуватись або як екземпляр батьківського класу (бути приведеним до батьківського класу), або як екземпляр класу-нащадка. Якщо у класі-нащадку є функції, що перекривають (мають таку ж сигнатуру) функції із батьківського класу, то поведінка при виклику таких методів (при використанні даного об'єкта як екземпляра батьківського класу) є невизначеною.

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


Реалізація Техніка виклику віртуальних методів називається ще «динамічним (пізнім) зв'язуванням». Мається на увазі, що ім'я методу, використане в програмі, зв'язується з адресою входу конкретного методу динамічно (під час виконання програми), а не статично (під час компіляції), так як в момент компіляції, в загальному випадку, неможливо визначити, яка з існуючих реалізацій методу буде викликана.

У компільованих мовах програмування динамічне зв'язування виконується зазвичай з використанням таблиці віртуальних методів, яка створюється компілятором для кожного класу, що має хоча б один віртуальний метод. В елементах таблиці знаходяться покажчики на реалізації віртуальних методів, що відповідають даному класу (якщо в класі-нащадку додається новий віртуальний метод, його адреса додається в таблицю, якщо в класі-нащадку створюється нова реалізація віртуального методу - відповідне поле в таблиці заповнюється адресою цієї реалізації) . Таким чином, для адреси кожного віртуального методу в дереві спадкоємства є одне, фіксоване зміщення в таблиці віртуальних методів. Кожен об'єкт має технічне поле, яке при створенні об'єкта ініціалізується покажчиком на таблицю віртуальних методів свого класу. Для виклику віртуального методу з об'єкта береться покажчик на відповідну таблицю віртуальних методів, а з неї, за відомим фіксованому зсуву, - покажчик на реалізацію методу, використовуваного для даного класу. При використанні множинного спадкоємства ситуація дещо ускладнюється за рахунок того, що таблиця віртуальних методів стає нелінійної.

Див. також


This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.