c – Delphi中dynamic_cast的等价物是什么?

前端之家收集整理的这篇文章主要介绍了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!";

猜你在找的C&C++相关文章