使用static_cast然后使用dynamic_cast

时间:2016-02-03 13:07:51

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

我正在处理一个特殊情况,我无法直接使用dynamic_cast,因为该对象是void*。是先使用static_cast,然后使用dynamic_caststatic_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);
}

1 个答案:

答案 0 :(得分:3)

这将取决于指针如何成为void*开始。如果它被投射到void*的类型与投射到(这里MyClass*)相同,那么是的,这个演员阵容很好并按预期工作;

来自cppreference on static_cast

  

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

以这种方式使用static_cast基本上是对编译器说'#34;我知道它是这种类型 - 相信我&#34;,并且编译器有义务。

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

目前,该功能可以简化为:

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

或者只是使用裸static_cast<>

旁注;值得一提的是reinterpret_cast has similar functionality;

  

任何指向T1类型对象的指针都可以转换为指向另一种类型cv T2的对象的指针。这与static_cast<cv T2*>(static_cast<cv void*>(expression))完全相同(这意味着如果T2的对齐要求不比T1更严格,则指针的值不会改变并将结果指针转换回原始类型,得到原始值。在任何情况下,如果类型别名规则允许,结果指针只能被安全地解除引用...