TObject中的Destroy为什么声明为虚拟方法 请教各位2个问题,多谢了! 1.TObject中的Destroy为什么声明为虚拟方法? 2.Delphi中已存在单元修改后可否重新编译,比如去掉System单元TObject类中Destroy的Virtual后再编译?? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1、为了派生类重载(override),你要明白Free的执行过程,才会懂得为什么要virtual。2、修改正确当然可以重新编译,但是你这样修改过后肯定是不对。 1.可以被子类继承和覆盖2.可以修改。但Destroy去掉Virtual会无法编译。 但我修改后,仍然可以编译,我把整个TObject类的程序都删除了还可以编译,我就想不明白了? 你要在PORJECT->ADD PROJECT中编译出DCU替换掉才行。 第一个问题是是为了派生类可以Override这个方法.第二个问题是可以的.一般单元都没问题.只是有两个单元比较特殊,System,sysinit这两个单元.用到了一些未公开的参数.所以必须命令行编译.dcc32.exe -O+ -Q -M -Y -Z -$D+ System.pas Destroy 方法是必须用 virtual 的, 因为一个对象的拆构过程, 调用者事实上还不“知道”该如何拆构自己,因为Destroy过程属于TObject类,随后不断被override,那么一个对象如果Free时,它调用的是哪个Destroy呢? 为啥叫不知道如何析构自己?哪个对象Free就调哪个对象的Destroy.实际上是调用的类的虚方法表,中Destroy所在偏移的函数.调用Destroy的时候不需要知道,只要调用这个表中固定便宜的函数即可,如果类Override了这个方法,那么该类方法表中的函数地址就被设置成新的函数地址了. 通过发送消息来传递字符串,接收方如何获得字符串? 如何在dbgrid中保存修改的数据 如何给cxGrid加一列选择框? 昨天散一分 没人接 今天再散一分 变量查询字符串数据的问题 请问如何枚举本机的所有的网卡和modem,并且获得他们的名称,IP地址和子网掩码? 如何在粘贴之前对要贴的内容进行检查 大讨论:各位前辈,你们在网上赚过钱吗?赚的多吗?请你们说说你们的经验,让我们刚出道的小弟学学! 在应用程序中如何屏蔽掉 CTRL,SHIFT键!? 这么久了,还是没人能给我一个答案!唉... RichEdit文字排版问题(指定坐标位置(坐标已知)插入文字)? 关于进程的新手问题
2、修改正确当然可以重新编译,但是你这样修改过后肯定是不对。
2.可以修改。但Destroy去掉Virtual会无法编译。
第二个问题是可以的.一般单元都没问题.只是有两个单元比较特殊,System,sysinit这两个单元.用到了一些未公开的参数.所以必须命令行编译.
dcc32.exe -O+ -Q -M -Y -Z -$D+ System.pas
哪个对象Free就调哪个对象的Destroy.
实际上是调用的类的虚方法表,中Destroy所在偏移的函数.调用Destroy的时候不需要知道,只要调用这个表中固定便宜的函数即可,如果类Override了这个方法,那么该类方法表中的函数地址就被设置成新的函数地址了.