endant: function1 ()В» <
};
* pointer = new Descendant (); * pointer_copy = pointer;
pointer-> function1 ();> function2 ();
_copy-> function1 ();
pointer_copy-> function2 ();
У цьому прикладі клас Ancestor визначає дві функції, одну з них віртуальну, іншу - ні. Клас Descendant перевизначає обидві функції. Однак, здавалося б однакове звернення до функцій дає різні результати. На виведення програма дасть наступне:
Descendant: function1 (): function2 (): function1 ()
Ancestor: function2 ()
Тобто, у разі віртуальної функції, для визначення реалізації функції використовується інформація про тип об'єкта і викликається В«правильнаВ» реалізація, незалежно від типу покажчика. При виклику невіртуальної функції, компілятор керується типом покажчика або посилання, тому викликаються дві різні реалізації function2 (), незважаючи на те, що використовується один і той же об'єкт. p align="justify"> Слід зазначити, що в С + + можна, при необхідності, вказати конкретну реалізацію віртуальної функції, фактично викликаючи її Невіртуальна:
pointer-> Ancestor: function1 ();
для нашого прикладу виведе Ancestor: function1 (), ігноруючи тип об'єкта.
Приклад віртуальної функції в Delphi
Мова Object Pascal, що використовується в Delphi, теж підтримує поліморфізм. Розглянемо приклад:
Оголосимо два класи. Предка (Ancestor):
TAncestor = class
private
protected
public
{Віртуальна процедура.}
procedure VirtualProcedure ; virtual;
procedure StaticProcedure ;
end;
і його нащадка (Descendant):
TDescendant = class (TAncestor)
private
protected
public
{Перекриття віртуальної процедури.}
procedure VirtualProcedure; override;
procedure StaticProcedure;
end;
Як видно в класі предка оголошена віртуальна функція -...