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

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

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

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

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

Приклад віртуальної функції на C ++

Приклад на C ++. ілюструє відміну віртуальних функцій від невіртуальних:

У цьому прикладі клас Ancestor визначає дві функції, одну з них віртуальну, іншу - немає. Клас Descendant переопределяет обидві функції. Однак, здавалося б однакове звернення до функцій дає різні результати. На виведення програма дасть наступне:

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

Слід зазначити, що в С ++ можна, при необхідності, вказати конкретну реалізацію віртуальної функції, фактично викликаючи її невіртуальну:

для нашого прикладу виведе Ancestor :: function1 (). ігноруючи тип об'єкта.

Приклад віртуальної функції в Delphi

Мова Object Pascal. використовується в Delphi, теж підтримує поліморфізм. Розглянемо приклад:

Оголосимо два класи. Предка (Ancestor):

і його нащадка (Descendant):

Як видно в класі предка оголошена віртуальна функція - VirtualProcedure. Щоб скористатися перевагами поліморфізму, її потрібно перекрити в нащадку.

Реалізація виглядає наступним чином:

Подивимося як це працює:

Зауважте, що в розділі var ми оголосили два об'єкти MyObject1 і MyObject2 типу TAncestor. А при створенні MyObject1 створили як TAncestor. а MyObject2 як TDescendant. Ось що ми побачимо при натисканні на кнопку BitBtn1:

  1. Ancestor static procedure.
  2. Ancestor virtual procedure.
  3. Ancestor static procedure.
  4. Descendant override procedure.

Для MyObject1 все зрозуміло, просто зголосилися зазначені процедури. А ось для MyObject2 це не так.

Виклик MyObject2.StaticProcedure; привів до появи «Ancestor static procedure.». Адже ми оголосили MyObject2: TAncestor. тому і була викликана процедура StaticProcedure; класу TAncestor.

А ось виклик MyObject2.VirtualProcedure; привів до виклику VirtualProcedure; реалізованої в нащадку (TDescendant). Це сталося через те, що MyObject2 був створений не як TAncestor. а як TDescendant. MyObject2: = TDescendant.Create ;. І віртуальний метод VirtualProcdure був перекритий.

У Delphi поліморфізм реалізований за допомогою так званої віртуальної таблиці методів (або VMT).

Досить часто віртуальні методи забувають перекрити за допомогою ключового слова override. Це призводить до закриття методу. В цьому випадку заміщення методів в VMT не відбудеться і необхідна функціональність не буде отримана.

Ця помилка відстежується компілятором, який видає відповідне попередження.

Виклик методу предка з перекритої методу

Буває необхідно викликати метод предка в перекритому методі.

Оголосимо два класи. Предка (Ancestor):

і його нащадка (Descendant):

Звернення до методу предка реалізується за допомогою ключового слова «inherited»

Варто пам'ятати, що в Delphi деструктор повинен бути обов'язково перекритим - «override» - і містити виклик деструктора предка

У мові C ++ не потрібно викликати конструктор і деструктор предка, деструктор повинен бути віртуальним. Деструктори предків викликаються автоматично. Щоб викликати метод предка, потрібно явно викликати метод:

Для виклику конструктора предка потрібно вказати конструктор:

Дивитися що таке "Віртуальний метод" в інших словниках:

Віртуальний співрозмовник - У цій статті не вистачає посилань на джерела інформації. Інформація повинна бути проверяема, інакше вона може бути поставлена ​​під сумнів і вилучена. Ви можете ... Вікіпедія

Абстрактний метод - Цю статтю слід вікіфіціровать. Будь ласка, оформіть її згідно з правилами оформлення статей. Абстрактний метод (або чистий віртуальний метод (pure virtual method часто невірно перекладається як чисто віртуальний метод)) в ... Вікіпедія

Фабричний метод (шаблон проектування) - Шаблон проектування Фабричний метод Factory Method Тип: породжує Описано в Design Patterns Так Фабричний метод (англ. Factory Method) породжує шаблон проектування, надає подклассам інтерфейс для созда ... Вікіпедія

Фабричний метод - (англ. Factory Method) породжує шаблон проектування, надає подклассам інтерфейс для створення екземплярів деякого класу. У момент створення спадкоємці можуть визначити, який клас інстанцііровать. Іншими словами, Фабрика ... ... Вікіпедія

інтелектуальний постійний віртуальний канал - Метод організації зв'язку з використанням гібридного логічного з'єднання, створюваного на основі поєднання двох типів віртуальних каналів постійних (PVC) і комутованих (SVC). Адміністратор мережі робить налаштування з'єднань, проте ... ... Довідник технічного перекладача

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

Порівняння C Sharp і Java - Правильний заголовок цієї статті Порівняння C # і Java. Він показаний некоректно через технічні обмеження. Порівняння мов програмування Загальне порівняння Основний синтаксис Основні інструкції Масиви Асоціативні масиви Операції з ... ... Вікіпедія

  • Віртуальний метод. Джессі Рассел. Ця книга буде виготовлена ​​в відповідності з Вашим замовленням за технологією Print-on-Demand. High Quality Content by WIKIPEDIA articles! Віртуальний метод (віртуальна функція) - в ... Детальніше Купити за 1254 руб
  • Фабричний метод (шаблон проектування). Джессі Рассел. Ця книга буде виготовлена ​​в відповідності з Вашим замовленням за технологією Print-on-Demand. High Quality Content by WIKIPEDIA articles! Фабричний метод (англ. Factory Method) - породжує ... Детальніше Купити за 1 125 руб
  • Темпоміри. Швидкість сприйняття і шкали часу. Алюшин А.Л. Стрижневою для цієї книги є концепція, згідно з якою потік даних від органів сприйняття обробляється в мозку в дискретної формі, у вигляді нейрофізіологічних кадрів. Виходячи з ... Детальніше Купити за 348 руб
Інші книги по запросу «Віртуальний метод» >>