请问一些关于inherited的问题.(50分)

  • 主题发起人 主题发起人 小令
  • 开始时间 开始时间

小令

Unregistered / Unconfirmed
GUEST, unregistred user!
A.
重载过程时
1、直接写inherited;
2、inherited后面加过程名,如inherited create;
3、inherited后面加带参数的过程名,如inherited create(I:Integer);
有什么区别?我感觉它们之间好像没什么区别。
B.
例如:
procedure TCustomGrid.WMCancelMode(var Msg: TWMCancelMode);
begin
inherited; { this line }
CancelMode;//这个是不是对该方法的扩充
end;
C.其中Virtual,reintroduce是什么时候用?
TMyClass=Class
Procedure Test();virtual;
End;

TMyClass2=Class(TMyClass)
Procedure Test();override;
End;

TMyClass3=Class(TMyClass2)
Procedure Test(i:Integer);reintroduce;overload;virtual;
End;

TMyClass4=Class(TMyClass3)
Procedure Test(i:Integer);override;
End;

procedure TMyClass4.Test(i:Integer);
begin
inherited;//或
inherited Test;
end;
各位,不是我懒,不愿意看HELP文件.只是反复看来没看明白.
 
思考中、、、
 
关于C:
重新引入方法名称
有时候,需要在派生类中增加一个方法,而这个方法的名称与祖先类中的某个方法名称相同。在
这种情况下,没必要覆盖这个方法,只要在派生类中重新声明这个方法。但在编译时,编译器就会发
出一个警告,告诉你派生类的方法将隐藏祖先类的同名方法。要解决这个问题,可以在派生类中使用
reintroduce 指示符,下面的代码演示了reintroduce 指示符的正确用法:
type
TMBase = Class
procedure Execute;
end;
TMClass=Class(TMBase)
procedure Execute;reintroduce;
end;
摘自于《delphi 5开发人员指南》
我是这样认为用了reintroduce后就和祖先类的方法进行重载了,不知我说的对不对请高手指教!
 
A:inherited 如果在父类中有相同名称的函数,而且参数一致,默认调用父类同名函数
并且用调用者的参数去调用它.
调用父类的指定函数:
inherited create; 指定的函数名必须有无参数的形式.
inherited create(owner) 指定函数名且带参数.
B:CANCELMODE只是一个被调用的方法而已,唯一让你迷惑的是因为DELPHI取了个类似的名称
而已.你可以当他是ABCD或者其他任何方法.
C:Virtual是虚方法,他可以被override,虚拟方法在虚方法表里只存在一份.override的意思
其实是改变虚方法表中该方法的地址指针.所以调用函数的时候就无论在哪里调用,都会
调用到最外围的类实现的该方法,而无论调用位置类的该方法的实现如何.
reintroduce隐藏掉父类的虚方法.也就是说替换掉虚方法.
这样,继承了该类以后,调用TEST都将是调用Test(i:Integer)而不是TEST()
 
A.C是明白了.
可是B我依然没弄明白.
我的意思是:
procedure TCustomGrid.WMCancelMode(var Msg: TWMCancelMode);
begin
inherited; { this line }//一个过程中什么需要用的inherited
aaaa;//后面的代码有是起什么作用的?
CancelMode;//
end;
 
>>可是B我依然没弄明白.
>>我的意思是:
procedure TCustomGrid.WMCancelMode(var Msg: TWMCancelMode);
begin
inherited; { this line }//如果有祖先类的话,而且要继承方法或其他的;就要使用;
aaaa; //是你自己添加的,至于做什么,你叫他做什么,就做什么(a)。
CancelMode;//同上(a)。
end;
 
明白了.谢谢大家!
 
多人接受答案了。
 
后退
顶部