请教各位2个问题,多谢了!
  1.TObject中的Destroy为什么声明为虚拟方法?
  2.Delphi中已存在单元修改后可否重新编译,比如去掉System单元TObject类中Destroy的Virtual后再编译??

解决方案 »

  1.   

    1、为了派生类重载(override),你要明白Free的执行过程,才会懂得为什么要virtual。
    2、修改正确当然可以重新编译,但是你这样修改过后肯定是不对。
      

  2.   

    1.可以被子类继承和覆盖
    2.可以修改。但Destroy去掉Virtual会无法编译。
      

  3.   

    但我修改后,仍然可以编译,我把整个TObject类的程序都删除了还可以编译,我就想不明白了?
      

  4.   

    你要在PORJECT->ADD PROJECT中编译出DCU替换掉才行。
      

  5.   

    第一个问题是是为了派生类可以Override这个方法.
    第二个问题是可以的.一般单元都没问题.只是有两个单元比较特殊,System,sysinit这两个单元.用到了一些未公开的参数.所以必须命令行编译.
    dcc32.exe -O+ -Q -M -Y -Z -$D+ System.pas
      

  6.   

    Destroy 方法是必须用 virtual 的, 因为一个对象的拆构过程, 调用者事实上还不“知道”该如何拆构自己,因为Destroy过程属于TObject类,随后不断被override,那么一个对象如果Free时,它调用的是哪个Destroy呢?
      

  7.   

    为啥叫不知道如何析构自己?
    哪个对象Free就调哪个对象的Destroy.
    实际上是调用的类的虚方法表,中Destroy所在偏移的函数.调用Destroy的时候不需要知道,只要调用这个表中固定便宜的函数即可,如果类Override了这个方法,那么该类方法表中的函数地址就被设置成新的函数地址了.