c – Delphi中dynamic_cast的等价物是什么?
在Delphi中,C的dynamic_cast,reinterpret_cast和static_cast运算符(特别是在对象上使用时)相当于什么?
解决方法
reinterpret_cast的
大多数情况下,在Delphi中,强制转换是一个reinterpret_cast,即一种类型的位和字节被重新解释为好像它是另一种类型,例如整数(myEnum)或指针(MyDynamicArrayVar). 一些强制转换会切断位,即Integer(MyInt64)将切断Int64的前32位,而低32位的高位将成为新的符号位.一些演员阵容扩大,例如整数(myByte),虽然这种转换为更大的类型不需要强制转换.来自的转换,例如整数到浮点也不需要强制转换. 但有时它不是reinterpret_cast,并且强制执行转换(例如,如果字符串为空,则从字符串转换为PChar转换;从AnsiString转换为UTF8String将内容转换为UTF-8,UnicodeString(myAnsiChar)转换甚至两次,从AnsiChar到AnsiString再到UnicodeString,虽然这些步骤可能并非全部可见).并且一些演员表是不允许的(例如Int64(MyDouble)或某些尺寸不匹配的演员表). 请注意,对于运算符重载(主要用于记录),您也可以进行显式和隐式转换.显式转换采用强制转换的形式.隐式转换也可以通过“强制转换”来强制执行. Delphi中的强制转换形式始终是typename(cast_object),它将cast_object强制转换为typename. 使用指针可以规避一些无效的强制转换.如果您执行以下操作: MyInt64 := PInt64(@MyDouble)^; 其中PInt64是指向Int64的指针,其他类型很明显, 那么你可以将一个Double转换为Int64.请注意,没有实际的指针杂耍.转换是直接的,就像你做的那样 MyInt64 := Int64(MyDouble); // Invalid typecast -- except in some versions Delphi中没有额外的static_cast类型.我个人希望我们有像C这样的明确演员.德尔福更像是在C. 的dynamic_cast 如果涉及的类型是类或接口,则使用as和is关键字的等价物.例如: myEdit := MyTObject as TEdit; myIntf := MyObj as ISomeInterface; 两个动态上调.与C不同,如果MyTObject不是TEdit的实例,或者如果myObj没有实现ISomeInterface,则会引发(抛出C)EInvalidCast异常.它在其他方面等同于C: TEdit *myEdit = dynamic_cast<TEdit *>(MyTObject); if (myEdit == NULL) throw ... 像C中的dynamic_cast一样,查询可以通过以下方式完成: if MyObject is TEdit then TEdit(MyObject).Text := 'Hello,world!'; 这或多或少等同于C中的这种“模式”: TEdit *e = dynamic_cast<TEdit *>(MyObject); if (e != NULL) e->Text = "Hello,world!"; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |