书中2.3节继承的本质里面,列举了一例程:
类是这样定义的:
type
    TBase = class
    public
        FBaseMember1 : Integer;
        FBaseMember2 : Integer;
    end;    TDerived = class(TBase)
    public
        FDerivedMember : Integer;
    end;    TDerived2 = class(TDerived)
    public
        FDerived2Member1 : Integer;
        FDerived2Member2 : Integer;
    end;主程序里面一个TButton、一个TListBox控件
在事件Button1Click中写入如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
    Obj : TDerived2;
begin
    Obj := TDerived2.Create();  with ListBox1.Items do
  begin
    add('对象大小'+IntToStr(Obj.InstanceSize));
    add('对象首地址'+IntToStr(Integer(Obj)));
    add('TBase成员FBaseMember1地址'+IntToStr(Integer(@Obj.FBaseMember1)));
    add('TBase成员FBaseMember2地址'+IntToStr(Integer(@Obj.FBaseMember2)));    add('TDerived扩展成员(FDerivedMember)首地址'+IntToStr(Integer(@Obj.FDerivedMember)));    add('TDerived扩展成员(FDerived2Member1)首地址'+IntToStr(Integer(@Obj.FDerived2Member1)));
    add('TDerived扩展成员(FDerived2Member2)首地址'+IntToStr(Integer(@Obj.FDerived2Member2)));  end;    Obj.Free();
end;运行在我的机器得到如下结果:
   对象大小24
   对象首地址13444568
   TBase成员FBaseMember1地址13444572
   TBase成员FBaseMember2地址13444576
   TDerived扩展成员(FDerivedMember)首地址13444580
   TDerived扩展成员(FDerived2Member1)首地址13444584
   TDerived扩展成员(FDerived2Member2)首地址13444588但是,如果我在事件Button1Click中写入如下代码:
procedure TForm1.Button1Click(Sender: TObject);
var
  Obj1:TBase;
  Obj2:TDerived;
  Obj3:TDerived2;
begin
  Obj1:=TBase.Create;
  Obj2:=TDerived.Create;
  Obj3:=TDerived2.Create;
  with ListBox1.Items do
  begin
    add('对象大小'+IntToStr(Obj3.InstanceSize));
    add('对象首地址'+IntToStr(Integer(Obj1)));
    add('TBase成员FBaseMember1地址'+IntToStr(Integer(@Obj1.FBaseMember1)));
    add('TBase成员FBaseMember2地址'+IntToStr(Integer(@Obj1.FBaseMember2)));    add('TDerived扩展成员(FDerivedMember)首地址'+IntToStr(Integer(@Obj2.FDerivedMember)));    add('TDerived扩展成员(FDerived2Member1)首地址'+IntToStr(Integer(@Obj3.FDerived2Member1)));
    add('TDerived扩展成员(FDerived2Member2)首地址'+IntToStr(Integer(@Obj3.FDerived2Member2)));  end;  Obj1.Free;
  Obj2.Free;
  Obj3.Free;
end;再运行,得出如下结果:
   对象大小24
   对象首地址13444568
   TBase成员FBaseMember1地址13444572
   TBase成员FBaseMember2地址13444576
   TDerived扩展成员(FDerivedMember)首地址13444596
   TDerived扩展成员(FDerived2Member1)首地址13444620
   TDerived扩展成员(FDerived2Member2)首地址13444624为什么后三项的结果不一样呢??希望高手解惑,以前我还没有注意到这个问题!长了点,希望我描述清楚了!!

解决方案 »

  1.   

    这个很容易理解吧!?单纯从对象模型方面考虑,肯定不一样了:Obj2和3是两个不同的对象,而Obj3中的两个数据域FDerived2Member1和2也是各自独立的。怎么可能在内存中处于同一位置呢?
      

  2.   

    Sorry,有点理解错题意了,呵呵........不过道理还是一样的:单纯从对象模型方面考虑,肯定不一样了:代码一中的Obj和代码二中的Obj3是两个类型不同的对象,而Obj3中的两个数据域FDerived2Member1和2也是各自独立的。怎么可能在内存中处于同一位置呢?
      

  3.   

    个人理解
    两个扩展类创建时已经产生一个新的父类的实例(instanse),也就是对fbasememere1其实在内存中有三个实例
    如果
    add('TBase成员FBaseMember1地址'+IntToStr(Integer(@Obj1.FBaseMember1)));改为
    add('TBase成员FBaseMember1地址'+IntToStr(Integer(@Obj2.FBaseMember1)));我相信第一个地址也不会相同了
    你可以这样试下
    add('TBase成员FBaseMember1地址'+IntToStr(Integer(@Obj1.FBaseMember1)));
    add('TDerive成员FBaseMember1地址'+IntToStr(Integer(@Obj2.FBaseMember1)));
    add('TDerived成员FBaseMember1地址'+IntToStr(Integer(@Obj3.FBaseMember1)));
      

  4.   

    呵呵,还是楼上的表达清楚.........建议楼主去看看《Delphi技术手册》中关于对象模型的部分,讲解应该来说是我看到过的Delphi相关书籍中最深入的一个了,但还是感觉不过瘾....
      

  5.   

    好象只有英文版的,在www.playicq.comCSDN上MusicWind的专栏中有书中部分章节的翻译节选........
      

  6.   

    整本书都非常简单,适合初学Delphi的人来学习,不过实在书名不好,应该起一个入门的书名比较好