2014-11-28 2 views
0

У меня есть виртуальная функция Hello(), определенная как в родительском, так и в дочернем классе. Как вызвать родительский Hello() из дочернего Hello()?Вызывать родительскую виртуальную функцию от дочернего переопределения

TParent = class (TComponent) 
public 
    procedure Hello(); virtual; 
end; 

TChild = class (TParent) 
public 
    procedure Hello(); 
end; 


procedure TChild.Hello; 
begin 
    //call parent Hello(); 
end; 
+3

Обратите внимание на предупреждения компилятора, в частности, на * TChild.Hello ** hides ** virtual method * –

ответ

1

Необходимо наследовать метод. Вы также забыли добавить переопределения атрибут:

program Project1; 
type 
    TParent = class 
    procedure Hello(); virtual; 
    end; 

    TChild = class (TParent) 
    procedure Hello();override; 
    procedure Olleh; 
    end; 

    procedure TParent.Hello; 
    begin 
    writeln('pt'); 
    end; 

    procedure TChild.Hello; 
    begin 
    inherited; 
    end; 

    procedure TChild.Olleh; 
    begin 
    inherited Hello; 
    end; 

var child: TChild; 
begin 
    child := TChild.Create; 
    child.Olleh; 
    child.Hello; 
    readln; 
end. 

В качестве альтернативы вы можете вызвать родительский метод «Hello», как в Olleh, по явному указанию способа вызова. Обычно в переопределенном методе inherited голый, но иногда вам нужно явно вызвать один метод (например, в случае использования нескольких конструкторов или перегрузок).

+1

Помните, что 'Hello' является виртуальным и поэтому' TParent (self) .Hello' отправляется на основе типа времени выполнения, а не тип времени компиляции. Это означает, что 'TParent (self) .Hello' идентичен' Hello'. Другими словами, эта часть вашего ответа путается и вводит в заблуждение. Кроме того, что с downcasting? Кто это делает? –

+0

Исходный вопрос неоднозначен, я думал, что либо OP забывают ** переопределить **, либо желание OP было подавлено. Поэтому я поставил два решения. –

+0

Вы не понимаете мою точку зрения. Прочитайте мой комментарий еще раз и сравните результаты своей программы с модифицированной версией, которая заменяет «TParent (self) .Hello' с« Hello » –

Смежные вопросы