此代码有什么问题:
type
TobjAvisos = class
public
constructor Create;
destructor Free;
end;
implementation
constructor TobjAvisos.Create;
Begin
inherited Create;
end;
destructor TobjAvisos.Free;
begin
inherited Destroy;
end;
它编译时没有警告,但FixInsight返回一个警告:" W522析构函数没有覆盖指令"
答案 0 :(得分:11)
问题是您应该覆盖虚拟析构函数Destroy
。该虚拟析构函数是由非虚方法Free
调用的。
就目前而言,破坏你的类的唯一方法是直接调用析构函数。但是,预计Delphi类将支持通过Free
方法进行销毁。
你的课应该是这样的:
type
TobjAvisos = class
public
constructor Create;
destructor Destroy; override;
end;
覆盖虚拟析构函数Destroy
是使您的类使用Free
方法正常工作的唯一方法。
现在,使用虚拟析构函数Destroy
并支持Free
有两个主要原因:
Free
对象引用上调用nil
。析构函数不能。这对于异常处理的对象构造机制至关重要。 Free
允许安全销毁对象,即使对象的运行时类型比对象引用的编译时类型更多。 有关相关主题的一些有用的阅读可以在这里找到:Why should I not use "if Assigned()" before using or freeing things?