书中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为什么后三项的结果不一样呢??希望高手解惑,以前我还没有注意到这个问题!长了点,希望我描述清楚了!!
类是这样定义的:
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为什么后三项的结果不一样呢??希望高手解惑,以前我还没有注意到这个问题!长了点,希望我描述清楚了!!
解决方案 »
- 如何去掉MDI窗口的自带的那3个窗口排列?
- 怎么对单元文件重命名
- Class EOleExcepiton with message'操作已被用户取消' 咋回事??新手不大明白,大侠赐招,感激涕零
- 如何使dbgrid中的某一行某一列的颜色随着数据库的内容变化
- 分数不够再开帖!
- 老板到日本出差去了,爽! 散分.
- 高手们都来阿,极度变态的问题~~~~~~~~~~~~~~~
- BHO的一个问题
- 怎样用SENDmessage函数改变一个输入焦点 如EDIT1中的内容?
- 如何将String变量存储到文件中 ?
- 存储执行的问题,急等解决!!!先行谢过啦!!!
- 我通过TidHttp下载了一个Word文档,如何取出这个Word文档的纯文本
两个扩展类创建时已经产生一个新的父类的实例(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)));