虚拟方法和动态方法不同于静态方法,它们可以在其后裔类中被覆盖(overridden),即只有一个方法所在类的祖先类对应的方法是virtual或dynamic的,这个当前类的方法才可以用overide覆盖。当一个覆盖方法被调用时,方法调用中使用的类或对象的实际(运行时)类型决定了哪一个实现是有效的,而非变量声明的类型决定。virtual方法是可以有实现的部分的,也可是在后裔类中override。  
  abstract抽象方法是那些在类中声明但未实现的虚拟方法或动态方法。抽象方法的实现推延到后裔类中。声明抽象方法必需在指示字virtual或dynamic之后使用abstract。例如:procedure   DoSomething;   virtual;   abstract;     即abstract方法是没有实现的,实现推延到后裔类中,后裔override这个方法后可以有实现部分。  
  如果:  
  TBaseObj=class  
      public  
          procedure   AMethod;  
      end;  
  TChildObj=class(TBaseObj)  
          procedure   AMethod;  
      end;  
  {   TBaseObj   }  
  procedure   TBaseObj.AMethod(str:string);  
  begin  
      showmessage('TBaseObj.AMethod;');  
  end;  
  {   TObj   }  
  procedure   TChildObj.AMethod(str:string);  
  begin  
      showmessage('TChildObj.AMethod;');  
  end;  
  实际上两个类的AMethod方法无任何关系。子类中将看不到祖先类的AMethod方法,而只有自已的AMethod方法,运行下面事件过程将执行  
    showmessage('TChildObj.AMethod;');  
  procedure   TForm1.Button2Click(Sender:   TObject);  
  var  
      childobj:TChildObj;  
  begin  
      childobj:=TChildObj.Create;  
      childobj.AMethod;  
  end;  
  如果  
  TBaseObj=class  
      public  
          procedure   AMethod(str:string;i:integer=0);virtual;  
      end;  
  TChildObj=class(TBaseObj)  
          procedure   AMethod(str:string);  
      end;  
  pprocedure   TBaseObj.AMethod(str:string;i:integer=0);  
  begin  
      showmessage('Base'+str);  
  end;  
  {   TObj   }  
  procedure   TChildObj.AMethod(str:string;i:integer=0);  
  begin  
      showmessage('Child'+str);  
  end;  
  执行下面事件过程,将看到showmessage中显示'ChildAMethod;'     并有[Warning]   Unit1.pas(28):   Method   'AMethod'   hides   virtual   method   of   base   type   'TBaseObj'的编译信息显示,说明在子类没有用override关键字时,声明一个与祖先类同名的方法是会隐藏祖先类的同名方法,执行自已的方法。而在子类方法声明后加reintroduce就不会有编译信息显示。如果使用override,要保证子类与祖先类方法的参数类型,顺序返回值相同,不然会在编译时报错:  
  因此交上面子类声明改为:procedure   AMethod(str:string;i:integer=0);override;,实现部分也要相应更改,这样执行下面事件过程,即子类方法覆盖了祖先类方法最后将看到showmessage中显示'ChildAMethod;'   ,如果有多个子类,都override那个virtual的祖先类的方法,那么最后执行结果是子类的这个AMethod方法,覆盖了祖先类同名方法的实现内容。实际上如果祖先类的这个方法是virtual;abstract的结果也是一样的,。即祖先类只定义一个声明,具体实现由这个祖先类的子类们去完成,执行不同子类结果不同,因为各子类的AMethod实现细节都有所不同。  
  procedure   TForm1.Button2Click(Sender:   TObject);  
  var  
      childobj:TChildObj;  
  begin  
      childobj:=TChildObj.Create;  
      childobj.AMethod('AMethod;');  
  end;  
  另一个有用的东西是:inherited关键字,如果将上面的子类方法实现改为:  
  procedure   TChildObj.AMethod(str:string;i:integer=0);  
  begin  
      inherited;  
      showmessage('Child'+str);  
  end;  
  然后再运行Button2Click,则会先看到showmessage出BaseAMethod,再看到showmessage出ChildAMethod。为什么会有这种现象呢,看一下关于inherited的说明:  
      保留字inherited在实现多种行为中扮演特殊的角色。它可以出现在方法定义中,在其后面可以有或没有标识符。  
  如果inherited之后跟随一个成名名称,那么除了表示在封装了方法的类的直接祖先中搜寻成员之外,还可以表示标准的方法调用或者对属性或域的引用。  
  也就是说运行到inherited时会告诉当前inherited所在方法中祖先类的同名方法,所以先看到showmessage出BaseAMethod。如果祖先类中有一个abc方法,那么在此也可调用,即   inherited   abc,即如果inherited后面没参数,执行时找祖先类同名方法,有参数如abc则在祖先类找那个  
  abc方法。

转载于:https://www.cnblogs.com/hackpig/archive/2010/02/12/1667968.html

overridden/inherited关键字的读书笔记相关推荐

  1. c语言字母表关键字,读书笔记-C语言关键字

    001 关键字 C语言一共32个关键字 1. 声明和定义 在开始认识关键字前,必须要明白什么是声明,什么事定义: 定义:(编译器)创建一个对象,为这个对象分配一段内存并给他取上一个名字.在一个作用域内 ...

  2. 读书笔记:《SEO教程:搜索引擎优化入门与进阶》(2)——关键字

    关键字的位置和形式 搜索引擎分析网页时,在HTML源代码中是自上而下进行的,因此搜索引擎会更加重视网页源代码中首先出现的内容,因此在规划页面时,应非常重视页面的<head>节点: < ...

  3. Think in Java第四版 读书笔记9第15章 泛型

    Think in Java第四版 读书笔记9第15章 泛型 泛型:适用于很多很多的类型 与其他语言相比 Java的泛型可能有许多局限 但是它还是有很多优点的. 本章介绍java泛型的局限和优势以及ja ...

  4. .net框架读书笔记---虚方法

    接上一篇.net框架读书笔记---引用参数(ref/out), 一.虚方法调用机理 代码 namespace VirtualFunction { class Program { static void ...

  5. 《你不知道的JavaScript上卷》知识点整理与读书笔记

    各位路过的的大佬.求关注.求点赞.谢谢 第一部分 作用域和闭包 第1章 作用域是什么 1.1编译原理 1.2理解作用域 1.3作用域嵌套 1.5异常 第2章 词法作用域 2.1词法阶段 2.2欺骗词法 ...

  6. 读书笔记:编写高质量代码--web前端开发修炼之道(二:5章)

    读书笔记:编写高质量代码--web前端开发修炼之道 这本书看得断断续续,不连贯,笔记也是有些马虎了,想了解这本书内容的童鞋可以借鉴我的这篇笔记,希望对大家有帮助. 笔记有点长,所以分为一,二两个部分: ...

  7. 《Java: The Complete Reference》等书读书笔记

    春节期间读了下<Java: The Complete Reference>发现这本书写的深入浅出,我想一个问题,书中很多内容我们也知道,但是为什么我们就写不出这样一本书,这么全面,这么系统 ...

  8. 《C#图解教程》读书笔记之四:类和继承

    本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.万物之宗:Object (1)除了特殊的Object类,其他所有类都是派生类,即使他们没有显示基类定义. ( ...

  9. C++ Primer 第三版 读书笔记

    1.如果一个变量是在全局定义的,系统会保证给它提供初始化值0.如果变量是局部定义的,或是通过new表达式动态分配的,则系统不会向它提供初始值0 2.一般定义指针最好写成:" string * ...

  10. [原]《Web前端开发修炼之道》-读书笔记CSS部分

    如何组织CSS-分层 应用 css 的能力分两部分:一部分是css的API,重点是如何用css控制页面内元素的样式:另一部分是css框架,重点是如何对 css 进行组织.如何组织 css 可以有多种角 ...

最新文章

  1. MySQL 5.6中如何定位DDL被阻塞的问题
  2. 邻接表终极解析===和vector写法的区别
  3. CoreOS 和 Kubernetes 1.5 自主运行 Kubernetes、Container Linux
  4. 开源 免费 java CMS - FreeCMS1.2-标签 mailList
  5. D - Mike and strings
  6. 快速优雅的为React组件生成文档
  7. [JavaScript]为JS处理二进制数据提供可能性的WEB API
  8. 全球及中国航空材料行业发展动态及应用格局展望规划报告2021-2027年版
  9. python中自定义变量名标识符_name是python的标识符吗
  10. boost::mpl::integral_c用法的测试程序
  11. jpa 返回数据转换_如何使用JPA类型转换器加密数据
  12. 【剑指offer】_14 不用加减乘除做加法
  13. es的聚合数据的准确性
  14. 切换输入法快捷键_输入法失灵怎么办?该怎么恢复?
  15. 用SQL表达内连接和外链接
  16. [转载] Java之可变参数
  17. 代码Review那些事
  18. 看图纸V3.2.1正式版[看图纸正式版下载]
  19. 【VS插件】VS2012设置透明背景
  20. 两年工作经验,三面拼多多,最终获得offer!(面经总结)

热门文章

  1. 递归问题学习二之卡牌组合问题
  2. 基础知识之什么是I/O
  3. python列表用来有序存放一组_Python期末习题练习
  4. mysql数据库d盘_Windows Server 2008 R2下修改MySQL 5.5数据库目录为D盘
  5. linux 项目文件管理,VS2017开发Linux程序之管理已有的makefile工程
  6. postman 测试excel下载_使用Postman轻松实现接口数据关联
  7. matlab中制作软件,2020-02-27 MATLAB App Designer——在 App 设计工具中创建辅助函数
  8. meta http-equiv(属性详解)
  9. Scala之flatMap操作
  10. 删除Linux上的用户