1) Есть Class1, с методом Mtd. 2) Eсть Class2 наследованный от Class1, метод Mtd перезаписан 3) В программе используется переменная типа Class2 Можно ли из программы вызвать Mtd от Class1, Другими словами, можно ли вызвать перезаписанный метод класса-предка?
Способ 1(только для не виртуальных методов) var a:class2; begin
a:=class2.Create;
class1(a).mtd;
....
end; Автор ответа:Fantasist Взято с Vingrad.ru http://forum.vingrad.ru
Способ со статическим приведением годится только для невиртуальных методов, имеющих одно имя. Вызов же виртуальных методов от статического типа не зависит. В твоём простейшем случае достаточно написать inherited Mtd; (ты его можешь вызвать из любого метода TClass2, не только из Mtd). Трудности возникнут, когда нужно вызвать метод "дедушки" или "прадедушки" и т.д. Один из способов, описанных в литературе, - временная замена VMT объекта на "дедушку" и обратно. Но если у дедушки такого метода не было - будет облом. Я предпочитаю такой способ:
type TProc = procedureofobject; procedure TClassN.SomeMethod; var Proc: TProc; begin TMethod(Proc).Code := @TClass1.Mtd; // Статический адрес TMethod(Proc).Data := Self; Proc(); end; Автор ответа:Le Taon Взято с Vingrad.ru http://forum.vingrad.ru