您的当前位置:我要购书网>在线阅读>Delphi/Perl

create为什么可以为虚函数?

来源:互联网  作者:我要购书网信息中心  发布:我要购物网收集整理  发布时间:2006-8-31 人气:344

今天一个好友在群里问:: 在VCL库里,大多数构造函数是virtual的,这是为啥: 按理,在调用构造函数之前,对象都还没有,: 当然也应该没有vtbl,那么这样virtual有什么意义呢?: 所以C++里的构造函数没有virtual的。: 难道Delphi里不是酱紫地?: 那么vtbl是在什么时候被初始化的?

首先,为什么没有调用构造函数之前,调用virtual函数没有意义,而调用实函数就有意义呢?因为虚方法和实方法不同,调用实方法的时候,实际上是调用类的方法,在实例没有创建前,就可以调用的。而虚方法不同,虚方法依赖于实例,必须要实例的vmt表建立后才能调用。

那么回到主题,为什么vcl里很多构造函数是虚函数呢?

因为vcl的初始化实际上都是在newInstance里完成的。 create只是把最后的堆内存,变成可用的指针 在delphi源代码里,可以看到:class function TObject.NewInstance: TObject;begin Result := InitInstance(_GetMem(InstanceSize));end; class function TObject.InitInstance(Instance: Pointer): TObject;{$IFDEF PUREPASCAL}var IntfTable: PInterfaceTable; ClassPtr: TClass; I: Integer;begin FillChar(Instance^, InstanceSize, 0); PInteger(Instance)^ := Integer(Self); ClassPtr := Self; while ClassPtr <> nil do begin IntfTable := ClassPtr.GetInterfaceTable; if IntfTable <> nil then for I := 0 to IntfTable.EntryCount-1 do with IntfTable.Entries[I] do begin if VTable <> nil then PInteger(@PChar(Instance)[IOffset])^ := Integer(VTable); end; ClassPtr := ClassPtr.ClassParent; end; Result := Instance;end;{$ELSE}可以看出,最终的构造是在newInstance里完成。

相关文章
· creating user controls
· create为什么可以为虚函数?
· createprocess创建的子进程的命令行参数
· cruisecontrol简介
· cricheditdoc在关闭非cricheditvie..
· createprocess使用心得
· createwindow 函数
· createremotethread简单应用
· create a menu item into the ..
· creating your own validation
热点文章
%>
· creating user controls
· 提高fastreplace速度 (fstrrep.pas)
· asc ii 完整码表及简介
· 自动生成拼音(汉字反查到拼音)
· sql2000无法安装的解决办法
· 浏览器集成教学 自定义浏览器
· vc++技术内幕(第四版)笔记(第7章)
· mysql5.0中文乱码解决方案
· sql server日期计算
· vc下利用ado连接access数据库
 淘宝旺旺:我要购书网上书店『图书目录
本购书中心地址: 杭州市延安路111号清波商厦南楼D座(总部) 上海市闸北区老沪太路网上购书中心(沪部),  邮编:310002
电子邮件:books@51goushu.com  经营许可证编号:沪ICP备06038574号
版权所有 2003-2008 © All Rights Reserved .购书网