ustify"> Виклик MyObject2. StaticProcedure; призвів до появи В«Ancestor static procedure.В». Адже ми оголосили MyObject2: TAncestor, тому і була викликана процедураStaticProcedure; класу TAncestor. p align="justify"> А от виклик MyObject2. VirtualProcedure; привів до виклику VirtualProcedure; реалізованої в нащадку (TDescendant). Це сталося тому, що MyObject2 був створений не какTAncestor, а як TDescendant: MyObject2:
= TDescendant. Create; І віртуальний метод VirtualProcdure був перекритий.
У Delphi поліморфізм реалізований за допомогою так званої віртуальної таблиці методів (або VMT).
Досить часто віртуальні методи забувають перекрити за допомогою ключового слова override . Це призводить до закриття методу. У цьому разі заміщення методів у VMT не відбудеться і необхідна функціональність що не отримана.
Ця помилка відстежується компілятором, який видає відповідне попередження.
Виклик методу предка з перекритої методу
Буває необхідно викликати метод предка в перекритому методі.
Оголосимо два класи. Предка (Ancestor):
TAncestor = class
private
protected
public
{Віртуальна процедура.}
procedure VirtualProcedure ; virtual;
end;
і його нащадка (Descendant):
TDescendant = class (TAncestor)
private
protected
public
{Перекриття віртуальної процедури.}
procedure VirtualProcedure; override;
end;
Звернення до методу предка реалізується за допомогою ключового слова В«inheritedВ»
procedure TDescendant. VirtualProcedure;
begin
inherited;
end;
Варто пам'ятати, що в Delphi деструктор повинен бути обов'язково перекритим - В«overrideВ» - і містити виклик деструктора предка
TDescendant = class (TAncestor)
private
protected
public