【问题标题】:Using static_cast and then dynamic_cast使用 static_cast 然后 dynamic_cast
【发布时间】:2016-02-03 13:07:50
【问题描述】:

我正在处理一种特殊情况,我不能直接使用dynamic_cast,因为对象是void*。是先使用static_cast,然后使用dynamic_cast(在static_cast的结果上)不好的做法吗?错了吗?

下面是我所说的一个例子:

MyClass* CastVoidPtr(void* pVoidPtr)
{
    // casting it to MyClass so we could use dynamic_cast
    MyClass* pTemp = static_cast<MyClass*>(pVoidPtr);

    // returning the actual result that will make sure that we have a MyClass object or a nullptr
    return dynamic_cast<MyClass*>(pTemp);
}

【问题讨论】:

  • pTemp 已经是MyClass*,你希望dynamic_cast 在这里做什么?您的评论没有意义 - 如果 pVoidPtr 是 nullptr,那么 pTemp 也会是,所以您仍然可以返回它。
  • 如果pVoidPtr 不是MyClass 类型,pTemp 不是非空的吗?
  • 原始评论:只是为了增强@Barry 的评论:return dynamic_cast&lt;MyClass*&gt;(pVoidPtr); 应该可以完成这项工作。有关更多详细信息,请参阅答案。编辑评论:哦,我不知道这是不可能的。忘记我的评论。
  • @RolandSarrazin 你不能 dynamic_cast 一个 void 指针。
  • @RolandSarrazin 如果只有 Bjarne 允许的话:(

标签: c++ void-pointers dynamic-cast static-cast


【解决方案1】:

这将取决于指针如何成为 void* 开头。如果它被转换为与被转换为相同类型的void*(此处为MyClass*),那么是的,这个转换很好并且可以按预期工作;

来自cppreference on static_cast

指向void(可能是 cv 限定的)类型指针的纯右值可以转换为指向任何类型的指针。如果原始指针的值满足目标类型的对齐要求,则结果指针值不变,否则未指定。将任何指向 void 的指针转换为指向原始(或更多 cv 限定)类型的指针都会保留其原始值。

以这种方式使用static_cast本质上是对编译器说“我知道它是这种类型 - 相信我”,编译器会答应。

然后可以在此之后评估 dynamic_cast。它通常用于转换为更派生的类型。在这里,您正在转换为相同的类型 - 它没有做任何特别有用的事情。如果该类型是更派生的类型(例如MySpecialisedClass),那就没问题了。


就目前而言,函数可以简化为:

MyClass* CastVoidPtr(void* pVoidPtr)
{
    return static_cast<MyClass*>(pVoidPtr);
}

或者简单地使用一个赤裸裸的static_cast&lt;&gt;


附注;为了完整起见,这里值得一提的是reinterpret_cast has similar functionality;

任何指向T1 类型对象的指针都可以转换为指向另一种类型cv T2 的对象的指针。这完全等价于static_cast&lt;cv T2*&gt;(static_cast&lt;cv void*&gt;(expression))(这意味着如果T2 的对齐要求不比T1 的更严格,则指针的值不会改变并且将结果指针转换回其原始类型会产生原始值)。在任何情况下,只有在类型别名规则允许的情况下,才能安全地取消引用结果指针...

【讨论】:

    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2010-11-18
    • 2014-05-29
    • 1970-01-01
    • 2011-01-16
    • 1970-01-01
    • 2010-09-24
    相关资源
    最近更新 更多