Delphi 从子重写函数调用父虚拟函数
我在父类和子类中定义了虚拟函数Delphi 从子重写函数调用父虚拟函数,delphi,Delphi,我在父类和子类中定义了虚拟函数Hello()。如何从子Hello()调用父Hello() 必须调用继承的方法。您还忘记添加覆盖属性: program Project1; type TParent = class procedure Hello(); virtual; end; TChild = class (TParent) procedure Hello();override; procedure Olleh; end; procedure TP
Hello()
。如何从子Hello()调用父Hello()
必须调用继承的方法。您还忘记添加覆盖属性:
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
中。通常在overiden方法中,继承的
是裸露的,但有时必须显式调用一个方法(例如在多个构造函数或重载的情况下)。请记住,Hello
是虚拟的,因此TParent(self)。Hello
是基于运行时类型而不是编译时类型调度的。这意味着t租金(self).Hello
与Hello
相同。换句话说,你答案的这一部分令人困惑和误导。还有,下行是怎么回事?谁曾经这样做过?最初的问题是模棱两可的,我认为要么是OP的忘记覆盖,要么是OP的愿望是沮丧。所以我提出了两个解决方案,你不明白我的意思。请再次阅读我的评论,并将程序的输出与替换t租金(self)的修改版本进行比较。Hello
与Hello
确定我已更正错误。这是一条下坡路。我的错。通过TParent(self)。Hello
我的意思是继承的Hello
。请注意编译器警告,特别是对TChild。Hello隐藏了虚拟方法
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.