一个覆盖的问题,还请帮忙看看,谢谢!(0分)

  • 主题发起人 主题发起人 awfigsk
  • 开始时间 开始时间
A

awfigsk

Unregistered / Unconfirmed
GUEST, unregistred user!
请问当派生类覆盖了基类的方法后,如果用inherited是否还可以执行基类的原有方法?
例如: procedure destroy();override;
begin
.... //这部分语句是用户自定义的方法
inherited
//在这条语句中,是调用基类的方法吗?
end;
 
如果没有覆盖,可以直接用inherited吗?还是要加限制符?
例:myObject.parent.method()
 
对于覆盖的过程,不能越级调用祖先的方法

如果没有覆盖,不能使用此关键字
在消息处理中也可以调用,用来执行父类的对应消息处理过程
如果被覆盖,调用基类的方法也就相当于调用了子类的方法,
如果没有覆盖,则可以使用强制类型转换来调用被隐藏的过程
 
你理解的完全正确
inherited destroy
使用这样的语句就会调用父类的destroy方法。也就是制定了方法。
inherited;既然不指定,就会调用父类中与覆盖方法最相似的方法。
所以最好养成好的习惯,明确指出继承父类的那个方法。
 
如果在定义时不加override,编译器会提示“隐藏祖先类同名的方法”
例如: type
TSome=class
destructor Destroy;
end;
...
procedure destroy();
begin
.... //这部分语句是用户自定义的方法
inherited
//在这条语句中,是调用基类的方法吗?
end;
这时,这里有inherited关键字,会出现什么情况呢?并且在调用Tsome.destroy会出错吗?
(我在程序中没有试过。还请高手指点!,谢谢!)
 
调用Tsome.destroy是不会出错的,但调用free就不能正确销毁对象了,因为“隐藏祖先类同名的方法”,此时的destroy再也不是虚函数了。
var
obj:Tsome;
obj:=Tsome.create;
..
obj.free;//并不能正确地销毁对象。实际上obj.free相当与TObject(Obj).free;
procedure TObject.free;
begin
if self<>nil then
Destroy

//此时self的类型强制转换为TObject引用类型了(虽然它指向Tsome对象),
//而且此时Tsome对象的VMT表中没有了Destroy,所以实现不了多态。
//因此self.destroy而实际是调用了Tobject.destroy而非Tsome.destroy。
end;
虽然直接使用destroy是没错的,但如果当不知道对象是否存在,而又要销毁它的时候,我们就显得手足无措了,VCL把destroy定义为虚函数,又在Tobject用一个静态方法来'包装'它,我们就可以随意地调用free了(前提是在free之后,把obj:=nil)。这正是VCL的精妙之处。
(Ps:静态方法并不需要对象存在而虚函数必须要求对象存在,)

在引入inherited关键字确实为了实现多态提供一些方便,使用它来调用基类的方法.
但inherited在一般方法是同样可以使用的,比如消息处理过程,不一定要求是虚函数。
 
接受答案了.
 
后退
顶部