Delphi 中的dynamic_cast 相当于什么?

2024-02-09

在Delphi中,相当于C++的什么dynamic_cast, reinterpret_cast, and static_cast运算符(尤其是在对象上使用时)?


重新解释_cast

大多数时候,在 Delphi 中,演员表是reinterpret_cast,即一种类型的位和字节被重新解释为另一种类型,例如Integer(myEnum) or Pointer(MyDynamicArrayVar).

有些演员会剪掉一些位,即Integer(MyInt64)将切断的前 32 位Int64,低32位的最高位将成为新的符号位。有些演员阵容会扩大,例如Integer(myByte),尽管这种到更大类型的转换不需要强制转换。转换自,例如Integer到浮点也不需要强制转换。

但有时它并不是一个reinterpret_cast,并且强制转换会进行真正的转换(例如,从string to PChar如果字符串为空则转换;演员阵容来自AnsiString to UTF8String将内容转换为 UTF-8,并且UnicodeString(myAnsiChar)甚至转换两次,从AnsiChar to AnsiString to UnicodeString,尽管这些步骤可能并不全部可见)。有些类型转换是根本不允许的(例如Int64(MyDouble)或某些尺寸不匹配的演员表)。

请注意,通过运算符重载(主要用于记录),您也可以进行显式和隐式转换。显式转换采用强制转换的形式。隐式转换也可以通过“强制转换”来强制。

Delphi 中强制转换的形式始终是typename(cast_object),这会投射cast_object to typename.

一些无效的强制转换可以使用指针来规避。如果你做类似的事情:

MyInt64 := PInt64(@MyDouble)^;

where PInt64是一个指向Int64其他类型是显而易见的,

然后你可以投一个Double to an Int64。注意没有完成实际的指针杂耍。转换是直接的,as if你已经做了

MyInt64 := Int64(MyDouble); // Invalid typecast -- except in some versions

没有多余的种类static_cast在德尔福。我个人希望我们有像 C++ 中那样的显式强制转换。 Delphi 更像是 C 语言。

动态转换

如果涉及的类型是类或接口,则存在使用以下等价物as and is关键词。例如:

myEdit := MyTObject as TEdit;
myIntf := MyObj as ISomeInterface;

都是动态向上转型。与 C++ 不同,这些会引发(在 C++ 中抛出)EInvalidCast异常如果MyTObject不是一个实例TEdit, or if myObj实施 ISomeInterface。在其他方面它与 C++ 等效:

TEdit *myEdit = dynamic_cast<TEdit *>(MyTObject);
if (myEdit == NULL) throw ...

查询,就像经常做的那样dynamic_cast在 C++ 中,可以用is:

if MyObject is TEdit then
  TEdit(MyObject).Text := 'Hello, world!';

这或多或少相当于 C++ 中的这种“模式”:

TEdit *e = dynamic_cast<TEdit *>(MyObject);
if (e != NULL)
    e->Text = "Hello, world!";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Delphi 中的dynamic_cast 相当于什么? 的相关文章

  • 如何保证对象只有一个线程

    我有以下代码 class Service public void start creates thread which creates window and goes to message loop void stop sends WM C
  • 何时使用 =default 使析构函数默认?

    尽管对构造函数使用 default 对我来说很清楚 即强制编译器在其他构造函数存在时创建默认构造函数 但我仍然无法理解这两种类型的析构函数之间的区别 那些使用 default 的 那些没有显式定义并由编译器自动生成的 我唯一想到的是 gro
  • 为什么在创建矩阵类时使用向量不好?

    对于我的矩阵类 我做了 template
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 在 Xamarin 中隐藏软键盘

    如何隐藏软键盘以便在聚焦时显示Entry在 Xamarin forms 便携式表单项目中 我假设我们必须为此编写特定于平台的渲染器 但以下内容不起作用 我创建自己的条目子类 public class MyExtendedEntry Entr
  • 读取 C# 中的默认应用程序设置

    我的自定义网格控件有许多应用程序设置 在用户范围内 其中大部分是颜色设置 我有一个表单 用户可以在其中自定义这些颜色 并且我想添加一个用于恢复默认颜色设置的按钮 如何读取默认设置 例如 我有一个名为的用户设置CellBackgroundCo
  • 如何在 SqlDataReader.Read() 期间从死锁异常中恢复

    我的 NET 应用程序的事件日志显示 它在从 Sql Server 读取数据时偶尔会出现死锁 这种情况通常非常罕见 因为我们已经优化了查询以避免死锁 但有时仍然会发生 过去 我们在调用ExecuteReader函数在我们的SqlComman
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • Visual Studio Code:如何配置 includePath 以获得更好的 IntelliSense 结果

    我是使用 Visual Studio Code 的完全初学者 我不知道我在做什么 我已经四处搜索 也许还不够 但我找不到像我这样的人如何配置的简单解释c cpp properties json每当我单击带有绿色波浪线下划线的行旁边的黄色灯泡
  • Delphi:写入后代类中私有祖先的字段

    我需要修复第三方组件 该组件的类具有私有变量 该变量由其后代主动使用 TThirdPartyComponentBase class private FSomeVar Integer public end TThirdPartyCompone
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 检查 RoutedEvent 是否有任何处理程序

    我有一个自定义 Button 类 当单击它时 打开特定窗口 它总是执行相同的操作 我添加了一个可以在按钮的 XAML 中分配的 Click 事件 就像常规按钮一样 当它被单击时 我想执行 Click 事件处理程序 如果已分配 否则我想执行默
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • 您是否将信息添加到每个 .hpp/.cpp 文件的顶部? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 创建新的 C 头文件 源文件时 您会在顶部添加哪些信息 例如 您是否添加日期 您的姓名 文件描述等 您是否使用结构化格式来存储此信息 e g F
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • 矩阵到数组 C#

    这将是转换方阵的最有效方法 例如 1 2 3 4 5 6 7 8 9 into 1 2 3 4 5 6 7 8 9 in c 我在做 int array2D new int 1 2 3 4 5 6 7 8 9 int array1D new
  • C++0x中disable_if在哪里?

    Boost 两者都有enable if and disable if 但 C 0x 似乎缺少后者 为什么它被排除在外 C 0x 中是否有元编程工具允许我构建disable if按照enable if 哦 我刚刚注意到std enable i
  • 使用 QtWebEngine 将 C++ 对象暴露给 Qt 中的 Javascript

    使用 QtWebkit 可以通过以下方式将 C 对象公开给 JavascriptQWebFrame addToJavaScriptWindowObject如中所述https stackoverflow com a 20685002 5959
  • 从 JavaScript 中的 OnClientClick 事件中阻止 C# 中的 asp:Button OnClick 事件?

    我有一个asp Button在我的网页上 它调用 JavaScript 函数和代码隐藏方法 后者进行调用以导航到另一个页面 在 JavaScript 函数中 我正在检查条件 如果不满足这个条件 我想中止导航 以便OnClick方法未被调用

随机推荐

  • Visual Studio代码如何为命令调色板条目添加键绑定

    例如 我想为条目添加一个键绑定 Ctrl R Ctrl T Python 在终端中运行 Python 文件 非常感谢 您可以在Preferences gt Keyboard Shortcuts部分 搜索 在终端中运行 Python 文件 选
  • 在嵌入式 Jetty 上启用 TLS-1.2

    目前我正在使用启用 TLS 1 2 的代码 ServerConnector httpsConnector new ServerConnector server new SslConnectionFactory sslContextFacto
  • System.Configuration.ConfigurationManager.ConnectionStrings 没有配置连接字符串

    每当我尝试在 C 代码中运行任何内容时 都会收到以下错误 System InvalidOperationException was unhandled by user code Message No connection string co
  • PC 重新启动后,Visual Studio 有时会重建未修改的项目

    我有一个包含大约 50 个 C 项目的 Visual Studio 2013 解决方案 通常 如果我选择构建 F6 它只会构建已更改的项目 但有时在我关闭并重新启动我的电脑后 当我选择构建 F6 时 它会重建所有内容 为什么 当我重新启动电
  • 如何在 Web 服务中使用 JAXBElement

    我正在使用 WCF 开发一个可互操作的 Web 服务 我从 Java 客户端使用该服务 当我创建代理类时 它生成了所有 getter 和 setter 方法以及JAXBElement
  • 使用 SQL 中另一个表中的列更新表

    我需要根据从以下两个表中提取的数据创建一个新表 第一张表 Var cur number A 10 B 8 第二个表 Var new number A 2 A 11 B 4 B 6 新表应包含 Var 列和 Number 列 其中每个变量将有
  • w3school 包含 HTML,javascript 不工作

    所以 我最近使用了 w3school include html 这样我就不必将相同的 div 复制粘贴到我的所有页面 首先 我将它用于页眉和页脚 它使用了一些CSS样式 并且没有问题 工作完美 但是后来 我尝试再次将它用于我的下拉导航栏 其
  • RavenDB 会话 > 30

    如果我尝试保存要保存的项目列表 其中计数 gt 30 我会收到一条错误消息 最大请求数 30 已允许此会话 到达 Raven限制了数量 允许会话的远程调用 作为预警系统 预计会议时间很短 住过 Raven提供设施 像 Load string
  • 检查类上是否定义了方法

    如何检查方法是否直接在某个类上定义 而不是通过继承或包含 扩展定义 我想要类似 foo 的东西 在下面的 class A def a end end module B def b end end class C lt A include B
  • 设置 os.Mkdir 权限

    我正在尝试使用 os Mkdir 创建具有某些权限的目录 但由于某种原因我无法使其工作 我的测试程序是 package main import log os func main err os Mkdir testdir 0775 if er
  • 同时运行 React 和 Node。

    我有一个我认为不太独特的用例 但我遇到了挑战 我的应用程序是用express EJS编写的 在端口35上运行 我想包括react 所以我正在遵循教程 并在我现有的应用程序中编写这个应用程序 并在另一个端口上运行 当两个应用程序位于不同端口时
  • c++filt 源代码在哪里?

    有谁知道 c filt 源代码的链接 我想在我的代码中将 c filt 作为库调用 在 Linux 上你可以使用 usr include demangle h附带binutils dev包裹 您必须链接到libiberty from bin
  • Ansible 检查字典列表中是否存在键/值对

    我试图检查 Ansible 的字典列表中是否存在某个键 值对 我发现了这个问题 但是我不确定Python和ansible的语法是否不同 我从未在ansible中见过if语句 检查字典列表中是否已存在值 https stackoverflow
  • 读取和写入 NSMutableDictionary 到 plist 文件

    我正在努力拯救NSMutableDictionary in applicationDidEnterBackground of AppDelegate m一个到一个plist文件 保存后 我立即尝试检查该文件是否存在并读回 但找不到该文件 N
  • git request-pull:如何在命令行上创建(github)拉取请求?

    我克隆了一个项目 并将一个仅包含重命名的自述文件的分支推送到自述文件中 我正在尝试在命令行上创建拉取请求 只是为了从这里尝试 PR 而不是网站 git request pull origin master origin readme rea
  • 在 Ruby 中将 12 小时时间转换为 24 小时格式

    如何将 11am 和 10pm 转换为 11 00 和 22 00 有没有一种使用日期和时间类的简单方法 我首先会解析字符串Time strptime然后输出它Time strftime 这也确保了对您的原始格式的严格检查 require
  • python 绘制填充颜色的饼图

    我正在尝试绘制一个填充颜色的饼形 我尝试以不同的方式做到这一点 这是代码 ball pygame draw circle self screen self pink self pos self r 0 pygame gfxdraw pie
  • Hexdump反向命令

    The hexdump https www man7 org linux man pages man1 hexdump 1 html命令将任何文件转换为十六进制值 但是 如果我有十六进制值并且我想反转该过程 这可能吗 有一个类似的工具叫做x
  • Json <-> 与 GWT 一起使用的 Java 序列化 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Delphi 中的dynamic_cast 相当于什么?

    在Delphi中 相当于C 的什么dynamic cast reinterpret cast and static cast运算符 尤其是在对象上使用时 重新解释 cast 大多数时候 在 Delphi 中 演员表是reinterpret