zoukankan      html  css  js  c++  java
  • 纠正一个概念:类就有VMT,各实例不过是共享这个VMT而已

    不是只有实例才有VMT,举个例子,各实例的VMT地址是相同的:

    Use System.Contnrs;
    
    procedure TForm1.BitBtn2Click(Sender: TObject);
    var
      ObjList1, ObjList2: TList;
      p1, p2: Pointer;
    begin
      ObjList1 := TObjectList.Create(True);
      ObjList2 := TObjectList.Create(True);
      if ObjList1 = ObjList2 then
        ShowMessage('ObjList1 = ObjList2'); // 不执行
    
      p1:= PPointer(ObjList1)^;
      p2:= PPointer(ObjList2)^;
      if Integer(p1) = Integer(p2) then
        ShowMessage('ObjList1.VMT = ObjList2.VMT'); // 执行
    end;

    再和类的VMT比较:

    procedure TForm1.BitBtn3Click(Sender: TObject);
    var
      ObjList1, ObjList2: TList;
      p1, p2: Pointer;
    begin
      ObjList1 := TObjectList.Create(True);
      ObjList2 := TObjectList.Create(True);
      if ObjList1 = ObjList2 then
        ShowMessage('ObjList1 = ObjList2'); // 不执行
    
      p1:= Pointer(TObjectList);
      p2:= PPointer(ObjList2)^;
      if Integer(p1) = Integer(p2) then
        ShowMessage('TObjectList.VMT = ObjList2.VMT'); // 相等,执行
    end;

    这也相当于说,类的第一项元素就是VMT,而VMT的第一项内容是一个地址,它是指向一个函数的指针。

    ------------------------------------------------------------------------------------------------------------

    http://blog.csdn.net/linzhengqun/article/details/1755493

  • 相关阅读:
    Oracle创建表空间用户等
    centos7安装neo4j
    Linux 介绍和命令超详细
    Go 变量声明
    Manjaro 安装 & 配置
    Go Golang安装及环境变量配置
    python3集合与常用操作
    正则以及re库的使用
    Requests 库安装
    数据库-数据库管理系统-数据库系统
  • 原文地址:https://www.cnblogs.com/findumars/p/5303289.html
Copyright © 2011-2022 走看看