为什么我要使用dynamic_cast来转换为void*?

Fat*_*ror 12 c++ casting

所以我正在从"void*"中读取dynamic_cast的答案,虽然你不能从一个响应void *转换为T *几个响应,但指出可以将一个转换T *为a void *,但是不要给出任何指示为什么你'我想这样做.

这只是一个琐事,它是否可能,或者是否有意义?我想也许是为了可读性或明确表示我们正在转换为a void *,但鉴于其目的dynamic_cast,它并不适合我.

对于这个问题,是没有任何理由做其他任何事情比让T *变得void *含蓄?void *为了这个目的,我已经看过不时使用C风格的强制转换,我认为只是为了明确(假设我们没有做一些不寻常的事情,比如投射int到指针或其他东西).

Mat*_* M. 10

首先,在使用时,dynamic_cast<void*>(x)您将获得指向最派生对象的第一个字节的指针.只要静态类型x是多态的.

这在少数场景中很有用,其中地址用作对象标识:

  • 现在,您可以完全区分指向同一对象的子对象的指针,从指针到不相关的子对象.
  • 你现在可以走一些扭曲的图形而不需要多次访问同一个对象......这可以用于序列化.

当然,这肯定不是日常使用,但在C++中,内存地址是对象的事实上的标识符,因此从继承层次结构的任何部分访问它的机制当然对那些少数边缘情况很有用.

  • @FatalError :(注意:实用讨论)在单继承的情况下,基类是多态的,地址实际上应该是相同的.但是,只要您开始考虑多重继承或者如果基类不是多态而是派生类,则地址可能会有所不同.您可以将基类视为第一个(隐藏)属性 - >它们首先出现在构造函数的初始化列表中; 因此,当存在多个类时,第二个基数的开头和当前导出的不再重合(baring例外). (4认同)
  • 那么,如果我使用基类指针并将其强制转换为派生类,实际的地址值可能会有所不同?对不起,如果这是一个愚蠢的问题,我只是让它在大多数情况下对我来说是神奇的;). (2认同)
  • 我试了一下你是完全正确的,当我尝试使用多重继承时,我发现地址通过动态强制转换而不是静态强制转换或C样式强制转换.谢谢! (2认同)

Nic*_*las 5

这有一个目的,有点.它在规范中允许它的部分暗示.从N3337,第5.2.7节,第7段:

如果T是"指向cv void的指针",则结果是指向v指向的最派生对象的指针.

所以a dynamic_cast<void*>(...)真的是简写static_cast<void*>(dynamic_cast<MostDerivedType*>(...)).那将是有用的......有点儿.

使它有用的困难在于你不一定知道它是什么MostDerivedType.毕竟,每个表达式可能不同.因此,一旦你将它作为一个void*,你就不一定有办法安全地将其抛回.如果你猜测MostDerivedType并且只是static_cast它,而你错了,那么你就处于未定义的行为之中.然而,如果你执行该dynamic_cast类型(然后static_castvoid*),如果它不是那种类型,它将至少返回NULL.

所以不,我会说这不是很有用.如果您希望生活在C++的边界内而不依赖于潜在的未定义行为,那就不是了.