S
savetime
Unregistered / Unconfirmed
GUEST, unregistred user!
最近在读 VCL 源代码,被 TObject 和 TComponent 的 Create 方法弄糊涂了:
TObject.Create 调用 System._ClassCreate, System._ClassCreate 又调用
TObject.NewInstance, TObject.NewInstace 调用 TObject.InitInstance,
最后又调用了 TObject.AfterConstruction.
TObject.Create 不是虚方法.
可是到了 TComponent, TComponent.Create(AOwner: TComponent); virtual 覆盖了
TObject.Create, 那么考查以下语句:
var
AObj: TComponent;
begin
AObj := TComponet.Create(nil);
end;
这时 TComponent.Create 如何能够调用 TObject.Create 方法呢?是不是
Object.Create 方法一定会在任何类的 Constructor 函数之前自动调用。
如果是这样,那么 TObject.AfterConstructor 应该是在 Constructor 方
法之前调用,而这时(假设为TComponent) TComponent.Create(AOwner) 还
没有执行,也就是说继承类还没有初始化之前就调用AfterConstructor,
这显然是不对的。
希望有人能解释一下 TComponent.Create(AOwner: TComponent) 的编译器实现过程。
另外还有一个相关问题,TThreadList的定义如下:
TThreadList = class { 从TObject继承而来 }
constructor TThreadList.Create;
begin
inherited Create; { 这里的inherited Create是指什么,莫非是TObject.Create?}
InitializeCriticalSection(FLock); { 使用Windows函数调用建立临界区 }
FList := TList.Create;
FDuplicates := dupIgnore;
end;
TTheadList是从 TObject 继承下来的,它的 Create 方法中有一句 inherited Create;
这个inherited Create是调用 TObject.Create 吗?而 TObject.Create 不是虚方法。
希望有人能解释这个语句的意义。
TObject.Create 调用 System._ClassCreate, System._ClassCreate 又调用
TObject.NewInstance, TObject.NewInstace 调用 TObject.InitInstance,
最后又调用了 TObject.AfterConstruction.
TObject.Create 不是虚方法.
可是到了 TComponent, TComponent.Create(AOwner: TComponent); virtual 覆盖了
TObject.Create, 那么考查以下语句:
var
AObj: TComponent;
begin
AObj := TComponet.Create(nil);
end;
这时 TComponent.Create 如何能够调用 TObject.Create 方法呢?是不是
Object.Create 方法一定会在任何类的 Constructor 函数之前自动调用。
如果是这样,那么 TObject.AfterConstructor 应该是在 Constructor 方
法之前调用,而这时(假设为TComponent) TComponent.Create(AOwner) 还
没有执行,也就是说继承类还没有初始化之前就调用AfterConstructor,
这显然是不对的。
希望有人能解释一下 TComponent.Create(AOwner: TComponent) 的编译器实现过程。
另外还有一个相关问题,TThreadList的定义如下:
TThreadList = class { 从TObject继承而来 }
constructor TThreadList.Create;
begin
inherited Create; { 这里的inherited Create是指什么,莫非是TObject.Create?}
InitializeCriticalSection(FLock); { 使用Windows函数调用建立临界区 }
FList := TList.Create;
FDuplicates := dupIgnore;
end;
TTheadList是从 TObject 继承下来的,它的 Create 方法中有一句 inherited Create;
这个inherited Create是调用 TObject.Create 吗?而 TObject.Create 不是虚方法。
希望有人能解释这个语句的意义。