TBase = class
public
  procedure asd;
end;
TSub = class(TBase)
public
  procedure asd;
end;procedure TBase.asd;
begin
  showmessage('base');
end;procedure TSub.asd;
begin
  showmessage('sub');
end;这父类子类的asd过程是两个不同的过程,子类重新定义了asd,delphi6应用开发上说要用reintroduce,但现在不用没有出错,为什么????
但如果
procedure TSub.asd;
begin
  inherited;
  showmessage('sub');
end;也能执行父类的asd过程,这和virtual和override有些相似他们不同的地方在哪呢?如果不用virtual和override;
b1:TBAse;
s1:TSub;
  b1:=TBase.Create;
  s1:=TSub.Create;b1.asd  //  'base'
s1.asd  //  'sub'
-------------------------
  b1:=TSub.Create;
  s1:=TSub.Create;b1.asd  //  'base'
s1.asd  //  'sub'b1虽然是通过TSub创建的但TBase,TSub类不是虚拟类,没有虚方法表,所以b1.asd依然调用的类TBase的方法。如果两个类这样定义
TBase = class
public
  procedure asd;virtual;
end;
TSub = class(TBase)
public
  procedure asd;override;
end;那么
  b1:=TSub.Create;
  s1:=TSub.Create;b1.asd  //  'sub'
s1.asd  //  'sub'这就是虚拟方法的本意。我的问题是,reintroduce用在什么地方?究竟有什么作用,是不是可有可无??

解决方案 »

  1.   

    覆盖父类的方法时不用reintroduce只会报warning,是不影响运行的。
      

  2.   

    哦~~reintroduce是你告诉编译器要重载或覆盖某个方法,用了reintroduce编译器就不会在编译时发出警告信息,用不用无所谓
      

  3.   

    一般如果在子类要overload父类的虚拟方法时,就要在子类overload关键字之前使用reintroduce。不然系统会出示警告的。
    如下面
    TBase = class
    public
      procedure asd;virtual;
    end;
    TSub = class(TBase)
    public
      procedure asd;reintroduce; override;
                    ~~~~~~~~~~~~
    end;
      

  4.   

    应该是下面
    TSub = class(TBase)
    public
      procedure asd(i: integer);reintroduce; overload;                               
                               ~~~~~~~~~~~```
    end;
      

  5.   

    总结reintroduce对程序运行没有什么影响,不过加上他就表示你明确的告诉编译器,“我是真的要重写这个方法”,所以编译器就不出警告了。是不是这样?如果没有反对意见,下午结贴