Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 从子重写函数调用父虚拟函数_Delphi - Fatal编程技术网

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.