类助手不会覆盖祖先的虚拟方法

2023-12-11

我一直将类助手理解为扩展类或部分类。它们的作用就像原始基类代码的扩展。如果我复制代码的接口部分并将其添加到基类中,并在实现中也这样做,那么代码的运行方式将与助手的运行方式完全相同。这让我始终了解助手中的多态性以及为什么它们不能重写基类中的方法等。

但我发现这并不完全正确,因为如果是这样那么为什么他们不允许重写祖先(基类的父级)的方法?

这是我的意思的一个例子(我只会放置标题代码,而不放置实现代码):

type
  TAncestor = class
  public 
    procedure Test; virtual;
  end;

  TBase = class(TAncestor)
  public 
  end;

那么为什么下一个代码不正确:

THelper = class helper of TBase
public 
  procedure Test; override;
end;

我的错误是:

在基类中找不到方法“测试”!


类助手不能修改原始类布局。这就是为什么他们不能添加字段(但当然他们可以添加非虚拟非动态方法)。额外的方法并不是帮助类的真正一部分,它们只是告诉编译器每次看到该方法时,它应该pretend它是原来班级的一部分

但是重写虚拟方法意味着修改受帮助类的虚拟方法表,而这也是不可能的。编译器当然可以创建一个新的 VMT(指向代码的指针数组)并在其中进行覆盖,但是,因为类帮助器不会修改“帮助”实例,所以它不能简单地替换实例中的 VMT 指针与新的。因此无法使实例引用新的 VMT。

只有一种方法可以重写虚拟方法:通过继承。

文档 says:

辅助类型不能声明实例数据,但允许类字段。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类助手不会覆盖祖先的虚拟方法 的相关文章

  • 在TImageViewer中,如何获取用户点击图片的位置?

    在TImageViewer控件中 用户可以缩放或平移图片 我的问题是 当用户点击图片时 如何获取用户在图片上的点击位置 尤其是用户可以对图片进行放大 缩小或平移之后 如何获取对应的图片点击位置呢 As shown below How to
  • DELPHI 和 WANT 或 NANT

    We use 巡航控制 net http confluence public thoughtworks org display CCNET Welcome to CruiseControl NET在 Delphi 2006 应用程序中进行持
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 当 Delphi 处于覆盖模式时,如何更改它的光标形状?

    当使用 Delphi 的任何版本时 我有时会碰巧按下插入键并打开覆盖模式 这通常是一个很大的麻烦 并且您进入覆盖模式的唯一指示是编辑器底部的小文本 当使用其他程序 首先想到的是 Notepad 时 当您处于插入模式时 文本光标是 当您处于覆
  • FreePascal x64 上系统单元函数的汇编调用

    我有一些 Delphi 汇编代码 可以在 Win32 Win64 和 OSX 32 上编译并正常工作 XE2 但是 由于我需要它在 Linux 上工作 所以我一直在考虑编译它的 FPC 版本 到目前为止 Win32 64 Linux32 6
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 阻止 IDE 自动添加使用单位

    我正在将 Lazarus 项目转移到德尔福西雅图 Lazarus 项目依赖于 40 多个单元 包括控件 并具有多种应用程序 在所有项目的使用条款中 他们使用了以下内容 uses Classes SysUtils Forms Controls
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 为什么 Delphi 中的 ADO Next 记录处理速度变慢?

    我有一个多年前开发的 Delphi 4 程序 它使用Opus 直接访问 http sourceforge net projects directaccess 按顺序搜索 Microsoft Access 数据库并检索所需的记录 Delphi
  • H2161 重复资源[一个VCL项目可以有2个类名相同但命名空间不同的表单吗?]

    我尝试在 2 个不同的命名空间中创建具有相同类名的 2 个表单 FirstNameSpace ExampleFormName TExampleFormName SecondNameSpace ExampleFormName TExample
  • 从其可执行文件的路径获取服务名称

    我有一个可执行文件的路径 它是一个正在运行的服务应用程序 例如 C Program Files x86 Someapp somesvc exe 我想停止并启动它 为此我想我需要获取服务的名称 如下所示 this https stackove
  • 如何在表单上绘制半透明图像?

    我想在 Delphi 窗体上绘制半透明图像 但由于某种原因它不起作用 Here is the original PNG border is semi transparent 我将图像加载到TImage object Image1 Trans
  • 任何第三方都可以从我的项目加载嵌入式资源吗?

    请参考我的一篇之前的问题 https stackoverflow com questions 14681364 issues passing data from dll to application 我问的是如何从 DLL 加载已编译的资源
  • Delphi:现场记录应用程序错误

    使用 Delphi 7 我想知道是否有一个免费组件可以在我的应用程序在远程站点运行时收集诊断信息并帮助我调试错误报告 也许它会记录每个选择的菜单项 单击的控件 文本输入等 也许它只是在崩溃时转储堆栈 也许它还有其他作用 我不介意添加代码 例
  • D2010编译行数差异

    构建项目时 有两个地方会报告源代码行数 在编译进度对话框中 项目下 信息 在 Delphi 2007 中 对于我们正在构建的项目 这两个数字是相同的 在 Delphi 2010 中 这两个数字截然不同 1st 计数多出 100 万行或 40
  • 对于大型简单数据库,SQLite 和 DISQLite 有何比较?

    两者有什么区别SQLite http www sqlite org and DISQLite http www yunqa de delphi doku php products sqlite3 index为什么我要选择其中一个而不是另一个
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • Delphi - 如何使用 iPhone 作为图片源通过 OpenDialog 获取目录

    我有一个 Delphi 应用程序 D2010 它允许用户通过 OpenDialog 选择 JPG 文件 当我从普通 Windows 目录中选择文件时 我的 TOpenDialog Filename 包含该文件的完整路径 并且我的代码可以正常
  • 面向 Delphi 开发人员的 Qt

    有人知道为 Delphi C Builder VCL 开发人员解释 Qt 的书籍或教程吗 对于具有该背景的开发人员来说 学习 Qt 的最佳方法是什么 我对如何使用 Qt 完成我知道如何在 Delphi 中完成的事情特别感兴趣 例如 Qt 相
  • Windows 更新后 Active 设置为 False 时 TIdHttpServer 冻结

    我们有一个 Indy 版本 10 6 1 5235 TIdHttpServer 服务 多年来一直与 Delphi 2007 配合良好 在最新的 Windows 更新 KB4338815 和 KB4338830 之后 我们注意到当 TIdHt

随机推荐