在继承中,父类的function虚方法在子类中使用override后,为什么不能产生inherited关键字(200分)

  • 主题发起人 主题发起人 blue_morning
  • 开始时间 开始时间
B

blue_morning

Unregistered / Unconfirmed
GUEST, unregistred user!
请看父类中的:
protected
function SaveDataQuery: Longint
virtual;
到了子类中:
public
function SaveDataQuery: Longint
override;
使用Ctrl+Shift+C自动生成的代码中,没有inherited关键字,而procedure关键字的虚方法就能产生inherited关键字。 请参看其它两个procedrue的虚方法

为什么?

父类:
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm1 = class(TForm)
private
{ Private declarations }
protected
function SaveDataQuery: Longint
virtual;
procedure Test
virtual;
procedure HaveParam(var UserSelect: LongInt)
virtual;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.HaveParam(var UserSelect: Integer);
begin
UserSelect := ID_YES;
ShowMessage('TForm1.HaveParam');
end;

function TForm1.SaveDataQuery: Longint;
begin
Result := ID_YES;
ShowMessage('TForm1.SaveDataQuery: Longint');
end;

procedure TForm1.Test;
begin
ShowMessage('Test');
end;

end.

子类:
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Unit1, StdCtrls;

type
TForm2 = class(TForm1)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
function SaveDataQuery: Longint
override;
procedure Test
override;
procedure HaveParam(var UserSelect: LongInt)
override;
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.Button1Click(Sender: TObject);
var
i: Longint;
begin
HaveParam(i)
end;

procedure TForm2.HaveParam(var UserSelect: Integer);
begin
inherited;

end;

function TForm2.SaveDataQuery: Longint;
begin

end;

procedure TForm2.Test;
begin
inherited;

end;

end.
 
全国第一套 建筑钢结构专业程序发布www.casakj.com 欢迎下载!绝对受益匪浅
 
研究了一下,好像 function 默认不产生 inherited
 
yf168:警告你不要到处灌水,
 
IDE不支持,没办法的.只好自己加了.


function SaveDataQuery: Longint
override;
......
begin
Result:=inherited SaveDataQuery;
end;
 
IDE不支持,没办法的.只好自己加了.


function SaveDataQuery: Longint
override;
......
begin
Result:=inherited SaveDataQuery;
//再加入其他代码.
end;
 
其实好像应该是因为返回值的原因,才导致不会自己加inherited的,因为父类的返回值未知???
 
实际上是因为函数的参数表是未知的,因此无法自动添加

请注意inherited实际上是指执行父类的某个函数,在后面不带东西时默认执行与自己同名子的函数,
inherited OtherFunction也是可以的
 
多人接受答案了。
 
后退
顶部