在Delphi里,Self 应该是一个指针,它指向该对象属于的类的VMT(而不是它父类的VMT),但是为什么在<<Inside VCL>> 第180 的例子中,却说那个Self是指向TForm 的VMT指针?但我觉得好像这个SELF是指向TFORM1的,但例子运行出来又好像是对的。
这里有点不解,小弟儒蠢,希望有高手指点迷津。

解决方案 »

  1.   

    是指向TForm1的,你跟踪下self的值:Self: TForm1 $12F75C, FName = 'Form1';
    而且,它的方法表也是3,所以,一定是TForm1,而不是TForm.
      

  2.   

    这个在 system 中定义得很明白了
      vmtSelfPtr           = -76;
      vmtIntfTable         = -72;
      vmtAutoTable         = -68;
      vmtInitTable         = -64;
      vmtTypeInfo          = -60;
      vmtFieldTable        = -56;
      vmtMethodTable       = -52;
      vmtDynamicTable      = -48;
      vmtClassName         = -44;
      vmtInstanceSize      = -40;
      vmtParent            = -36;
      vmtSafeCallException = -32 deprecated;  // don't use these constants.
      vmtAfterConstruction = -28 deprecated;  // use VMTOFFSET in asm code instead
      vmtBeforeDestruction = -24 deprecated;
      vmtDispatch          = -20 deprecated;
      vmtDefaultHandler    = -16 deprecated;
      vmtNewInstance       = -12 deprecated;
      vmtFreeInstance      = -8 deprecated;
      vmtDestroy           = -4 deprecated;  vmtQueryInterface    = 0 deprecated;
      vmtAddRef            = 4 deprecated;
      vmtRelease           = 8 deprecated;
      vmtCreateObject      = 12 deprecated;Self 是每个对像都有的, TForm 是个类, TForm1 也是个类, 怎么可能 Self 指向是 TForm/TForm1 的??每个对像(class), 不管是任何类型, delphi简单类型除外, 负数的部分都是有内容的, 就像system定义, 哪怕你只申明一个类, 没有任何数据成员, 它的最小尺寸也是 40, deprecated 不在内Self 是指向当前对像数据域的开始地址(你的第一个数据成员), Self 的类型是个指针