zoukankan      html  css  js  c++  java
  • 深入类中的方法[1] - 虚方法与动态方法 转万一博客

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

    先从虚方法与动态方法开始吧
    //下面的类中就定义了两个虚方法(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 ;

    这样看来: virtualdynamic 并没有太多区别, 一个侧重速度、一个节约空间; 它们是可以互相代替的!

    另外: 因为它们区别不大, 并且是先有 virtual , 所以人们也习惯于把"虚方法"和"动态方法"都称作"虚方法".
  • 相关阅读:
    02-线性结构2 一元多项式的乘法与加法运算
    两个堆栈实现列队
    队列的顺序存储和链式存储实现
    包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈
    利用纯java捕获和播放音频
    许令波老师的java的IO机制分析文章
    soundtouch源码分析__based on csdn :
    java桌面项目打包_by icewee_写得太棒了,直接转载了
    白化检验( 白噪声准则检验 )
    对于冯嘉礼老师定性映射理论的复习
  • 原文地址:https://www.cnblogs.com/luckForever/p/7255040.html
Copyright © 2011-2022 走看看