zoukankan      html  css  js  c++  java
  • 面试-虚方法与动态方法(Delphi)

    相关资料:
    内容摘自万一老师博客
    https://www.cnblogs.com/fansizhe/p/12729750.html

    方法来到类中, 以前的特点基本都在;
    因为类一般是存在于一个继承链中, 所以就有了一些新的概念, 譬如: 继承、覆盖;
    也有了很多新名称, 譬如: 静态方法、虚方法、动态方法、抽象方法、类方法、消息方法.
    先从虚方法与动态方法开始吧

    //下面的类中就定义了两个虚方法(virtual)、两个动态方法(dynamic)
    TMyClass = class
    procedure Proc1(x,y: Real); virtual;
    function Fun1(x,y: Real): Real; virtual;
    procedure Proc2(x,y: Real); dynamic;
    function Fun2(x,y: Real): Real; dynamic;
    end;
    //定义成虚方法或动态方法, 就意味着在后来的子类中将要被覆盖(override), 也就是重写
    TBass = class
    procedure Proc(x,y: Real); virtual;
    function Fun(x,y: Real): Real; dynamic;
    end;

    TChild = class(TBass)
    procedure Proc(x,y: Real); override;
    function Fun(x,y: Real): Real; override;
    end;

    {正是因为这种机制而形成了多态}


    //那虚方法和动态方法有什么区别呢?
    每个类都内含着两个表: 虚方法表(VMT)和动态方法表(DMT);
    VMT 表包含着本类与其所有父类的虚方法 - 那一般会是一个比较庞大的表;
    DMT 表只包含本类的动态方法 - 如果要调用其上层类的动态方法, 只能逐级查找;
    因此, 使用虚方法速度上会有优势, 使用动态方法会节约内存;
    在 Delphi 初期只有 virtual 而没有 dynamic ; 后来随着 VCL 日渐庞大, 才有了 dynamic ;
    譬如类的事件方法一般都是在早期定义, 为了节约空间, 事件方法在 VCL 中基本都定义成了 dynamic ;
    这样看来: virtual dynamic 并没有太多区别, 一个侧重速度、一个节约空间; 它们是可以互相代替的!
    另外: 因为它们区别不大, 并且是先有 virtual , 所以人们也习惯于把"虚方法"和"动态方法"都称作"虚方法".
    编程语言无所谓高低级,唯适用罢了。语言结构再天花乱坠,富丽堂皇终不过CPU上的0和1。

  • 相关阅读:
    win7网络共享原来如此简单,WiFi共享精灵开启半天都弱爆了!
    JQUERY UI Datepicker Demo
    Official online document, install svn server in centOS
    JAVE not work in linux
    AMR 转mp3 失败
    XD, XR, DR 股票
    Linux 下MySql 重置密码
    Difinition Of Done
    Apache, Tomcat, JK Configuration Example
    Linux 安装tomcat
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/12842954.html
Copyright © 2011-2022 走看看