没有覆盖指令的析构函数

时间:2015-05-28 19:10:14

标签: delphi oop

此代码有什么问题:

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析构函数没有覆盖指令"

1 个答案:

答案 0 :(得分:11)

问题是您应该覆盖虚拟析构函数Destroy。该虚拟析构函数是由非虚方法Free调用的。

就目前而言,破坏你的类的唯一方法是直接调用析构函数。但是,预计Delphi类将支持通过Free方法进行销毁。

你的课应该是这样的:

type
  TobjAvisos = class
  public
    constructor Create;
    destructor Destroy; override;
  end;

覆盖虚拟析构函数Destroy是使您的类使用Free方法正常工作的唯一方法。

现在,使用虚拟析构函数Destroy并支持Free有两个主要原因:

    可以安全地在Free对象引用上调用
  1. nil。析构函数不能。这对于异常处理的对象构造机制至关重要。
  2. 支持Free允许安全销毁对象,即使对象的运行时类型比对象引用的编译时类型更多。
  3. 有关相关主题的一些有用的阅读可以在这里找到:Why should I not use "if Assigned()" before using or freeing things?