(delphi11最新学习资料) Object Pascal 学习笔记---第8章第4节(虚方法与动态方法)

news/2025/4/26 13:02:18/
8.4.4 继承和构造函数

​ 正如我们所见,您可以使用inherited关键字在派生类的方法中调用基类的同名方法(或者也不同方法)。对于构造函数也是如此。在其他语言(如C++、C#或Java)中,对基类构造函数的调用是隐式和强制性的(当必须向基类构造函数传递参数时),而在Object Pascal中,调用基类构造函数并不是强制性的。

​ 但在大多数情况下,手动调用基类构造函数是非常重要的。例如,任何组件类都是如此,因为组件的初始化实际上是在TComponent类级别完成的:

constructor TMyComponent.Create(Owner: TComponent);
begininherited Create(Owner);// 具体的代码...
end;

​ 这一点尤为重要,因为对于组件来说,Create 是一个虚方法。同样,对于所有类来说,Destroy 析构函数也是一个虚方法,您应该记得在其中调用inherited。

​ 还有一个问题: 如果你要创建一个只继承自 TObject 的类,你是否需要在它的构造函数中调用TObject.Create 构造函数?从技术角度看,答案是 “不需要”,因为构造函数是空的。不过,我认为无论如何,始终调用基类构造函数是一个好习惯。不过,如果你是一个性能狂人,我承认这可能会不必要地减慢你的代码…减慢的速度只有一微秒,完全无法察觉。

​ 玩笑归玩笑,这两种方法都有很好的理由,但特别是对于语言初学者来说,我建议始终调用基类构造函数,这是一种良好的编程习惯,能促进更安全的编码。

8.4.5 虚方法与动态方法

在 Object Pascal 中,有两种不同的方法可以激活延迟绑定。你可以将方法声明为Virtual(如前所述),或者声明为Dynamic方法。这两个关键字的语法完全相同,使用它们的结果也一样。不同的只是编译器用来实现延迟绑定的内部机制。

虚方法基于虚方法表(或 VMT,俗称 vtable)。虚方法表是一个方法地址数组。在调用虚方法时,编译器会生成代码,跳转到存储在对象虚方法表第 n 个槽中的地址。

虚方法表允许快速执行方法调用。虚方法表的主要缺点是需要为每个子类的每个虚方法创建一个条目,即使该方法在子类中没有被重新定义。有时,这会导致在整个类的层次结构中重复虚方法表项(即使是没有重新定义的方法)。这可能需要大量内存来多次存储相同的方法地址。

另一方面,动态方法使用方法的独立编号来进行调用。搜索相应函数的速度通常比虚方法的简单一步查表要慢。但这样做的好处是,动态方法条目只有在后代覆盖该方法时才会在后代中传播。对于大型或较深的对象层次结构,使用动态方法而不是虚方法可以显著节省内存,而对速度的影响微乎其微。

从程序员的角度来看,这两种方法的区别仅在于内部表示不同,速度或内存使用量略有不同。除此之外,虚方法和动态方法是一样的。

在解释了这两种模式的区别后,有必要强调的是,在大多数情况下,应用程序开发人员使用的是虚方法而不是动态方法。

Windows 上的消息处理程序

​ 在为 Windows 构建应用程序时,可以使用特殊用途的延迟绑定方法来处理 Windows 系统消息。为此,Object Pascal 提供了另一个指令 message 来定义消息处理方法,这些方法必须是带有适当类型的单个 var 形参的过程。在 message 指令之后,是该方法要处理的 Windows 消息的编号。例如,下面的代码允许你处理用户定义的消息,其数值由 WM_USER Windows 常量表示:

typeTForm1 = class(TForm)procedure WmUser(var Msg: TMessage); message WM_USER;end;

过程的名称和形参的实际类型由您决定,只要物理数据结构与 Windows 消息结构相匹配即可。用于与 Windows API 接口的单元包括许多为各种 Windows 消息预定义的记录类型。对于熟悉 Windows 消息和 API 函数的资深 Windows 程序员来说,这种技术非常有用,但这种技术绝对不兼容其他操作系统(如 macOS、iOS 和 Android)。


http://www.ppmy.cn/news/1404870.html

相关文章

HarmonyOS实战开发-一次开发,多端部署-视频应用

介绍 随着智能设备类型的不断丰富,用户可以在不同的设备上享受同样的服务,但由于设备形态不尽相同,开发者往往需要针对具体设备修改或重构代码,以实现功能完整性和界面美观性的统一。OpenHarmony为开发者提供了“一次开发&#x…

JAVA 100道题(25)

25.实现一个死锁示例,并解释如何避免死锁。 在Java中,死锁通常发生在两个或更多的线程无限期地等待一个资源,而该资源又被另一个线程持有,后者也在等待另一个线程释放资源。这形成了一个循环等待条件,导致所有涉及的线…

ffmpeg点对点音视频udp协议传输

参考:https://zhuanlan.zhihu.com/p/636152437?utm_id0 ffmpeg查看可用设备: ffmpeg -list_devices true -f dshow -i dummy1、音频 局域网内两台设备间 设备1-音频: ffmpeg -f dshow -i audio"麦克风阵列 (适用于数字麦克风的英特…

用TOMCAT部署web项目教程

文章目录 引言I 使用webapps文件夹II 利用server.xmlIII 自定义配置文件IV 预备知识4.1项目的一般结构4.2 contex标签4.3 IDE部署4.4 配置Tomcat服务引言 在开发阶段,一般使用IDE如MyEclipse来部署web项目,不要忘记手动部署的三种方式。 I 使用webapps文件夹 将项目文件夹…

VBA数据库解决方案第九讲:把数据库的内容在工作表中显示

《VBA数据库解决方案》教程(版权10090845)是我推出的第二套教程,目前已经是第二版修订了。这套教程定位于中级,是学完字典后的另一个专题讲解。数据库是数据处理的利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

数据分析之Logistic回归分析中的【多元有序逻辑回归】

1、定义 多元有序逻辑回归用于分析有序分类因变量与一个或多个自变量之间的关系。有序逻辑回归适用于因变量具有自然排序但没有固定间距的类别,例如疾病严重程度(轻度、中度、重度)或调查问卷中的满意度评分(非常不满意、不满意、…

C++算法补充---STL

这里写目录标题 CSTL容器字符串函数(string容器函数)字符串转字符 算法交换函数拿到容器或者数组的第一个最大(小)值元素的下标或者值排序函数求字符数组的有效长度atoi函数(将字符串类型的数字转为真正的int型数字)string转字符 …

练习 17 Web [极客大挑战 2019]PHP

常见的网站源码备份文件名和后缀,反序列化攻击 unserialize():wakeup绕过,private类以及属性序列化后的%00修改 开靶机 提到”备份“ 那看看有没有backup.php啥的 如果网站存在备份文件,常见的备份文件后缀名有:“.gi…