易截截图软件、单文件、免安装、纯绿色、仅160KB

Delphi 类与对象内存结构浅析(下)

对象空间
内存结构
对象的内存结构是固定的,对象创建完成后就无法改变。它主要存储了对象直属类的地址(等价于类的VMT),对象本身的成员数据,对象的接口方法表地址。结构如图所示:
说明:若类未声明接口,则对象空间不存储接口方法表地址。
 
类空间与对象空间的关系
类空间与对象空间:
示例:分析对象的基本内存结构
代码:
type
    IMyInterface = interface(IUnknown)
        ['{06F3EA2C-E9C2-410E-97BE-D88ADF775EC3}']
        procedure InterfaceMethod1;
    end;
    TMyObject = class(TInterfacedObject,IMyInterface)
    private
        FField1: Integer;
        FField2: Boolean;
    protected
        procedure InterfaceMethod1;
    public
        procedure DynamicMethod1; dynamic;
        procedure DynamicMethod2; dynamic;
        procedure VirtualMethod1; virtual;
        procedure VirtualMethod2; virtual;
    end;
    TMyObject2 = class(TMyObject)
    private
        FField3: Integer;
    public
        procedure DynamicMethod1; override;
        procedure VirtualMethod1; override;
    end;
 
内存结构:
TInterfacedObject内存结构如图:
TMyObject内存结构如图:
 
TmyObject2内存结构如图:
 
 
如图,TMyObject2的VirtualMethod1方法覆盖了父类的VirtualMethod1方法,故虚方法表中VirtualMethod1的指针指向了TMyObject2的VirtualMethod1方法。TMyObject2的DynamicMethod1方法覆盖了父类的DynamicMethod1方法,由于动态方法表只保存当前类的动态方法表,故表中只有一个DynamicM


相关文档:

DELPHI 查找,增加,修改,删除

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button ......

Delphi开发人员的编程习惯

关开发习惯的一些想法,如鲠在喉,不吐不快。究其发贴动机,当然不排除有骗取参与分的可能,但另一方面,也希望能给同行(念Xing)者提供一些建议,或者参考(希望不是误人子弟)。同时,也希望各位能够就我的这些陋习,发表一点看法,给出批评和指正的意见。谢谢。
一.建立工程目录
     &nbs ......

关于delphi中items和itemindex的问题

索引是itemindex
item是里面的内容
索引的话,是从0开始
item   itemindex
A      1
B      2
C      3
listbox1.items.count就是这个列表框里总共有多少项. ......

Delphi 能不能从Ring 3进入Ring 0

Delphi 能不能从Ring 3进入Ring 0?
楼主skyworld_xm(skyworld)2004-11-19 09:58:55 在 Delphi / Windows SDK/API 提问
Delphi   能不能从Ring   3进入Ring   0?  
  有例子吗?  
  多谢. 问题点数:100、回复次数:20Top
1 楼jinjazz(近身剪)回复于 2004-11-19 10:13:27 得 ......

Delphi中窗体响应按键步骤

1.因为KeyPreview默认是 False;我们这里需要响应键盘事件的话,需要将其修改为True;
所以KeyPreview:=True; 这对一些快捷键会有用。
在窗体属性上修改KeyPreview := True;
2.在窗体的FormKeyDown函数里写:
if KeyPreview then
    Form将先响应键盘事件(在TEdit等控件之前)
else
    除非Fo ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号