dynamic_cast<void*> 啥时候有用? [复制]

Posted

技术标签:

【中文标题】dynamic_cast<void*> 啥时候有用? [复制]【英文标题】:When is dynamic_cast<void*> useful? [duplicate]dynamic_cast<void*> 什么时候有用? [复制] 【发布时间】:2014-10-25 22:18:45 【问题描述】:

5.2.7/7 说了类似这样的话:

如果T 是“指向cv void 的指针”,则结果是指向x 指向的最派生类的指针。

这个synatx有什么好的应用?什么时候应该使用dynamic_cast&lt;void*&gt;

【问题讨论】:

以下是 MSalters 描述的示例:ideone.com/84U5ax 我认为分配器可以利用这一点(内存管理)。例如。如果你需要一块内存的起始地址,但你只有一个指向基类的指针。 @dyp:如果你已经有一个对象,它的内存必须已经分配,​​所以分配器不能再次分配它。对于解除分配,您需要的不仅仅是基地址,还需要派生最多的类型,以便可以运行所有析构函数。 @MSalters 如果你的析构函数是虚拟的,你就不需要最派生的类型,如果它不是虚拟的,那是你自己的错,无论如何你都搞砸了。 【参考方案1】:

一个常见的原因是要弄清楚IA*IB* 两个接口是否实际上是指向同一个底层对象的指针。如果需要,请使用演员表。

IIRC,在具有重复非虚基的多重继承的情况下,甚至有可能有两个比较不相等的 IA* 指针,但指向同一个对象 - 因为它们指向两个不同的 IA 子对象。

【讨论】:

我不明白dynamic_cast&lt;void*&gt;(ptr)static_cast&lt;void*&gt;(ptr) 有什么区别(因为void* 没有任何RTTI 或vtable).... @BasileStarynkevitch ptr 是一个指向类类型的指针,所以它可以有RTTI。 那么,void* 是一个通用指针,所以没有任何 RTTI,恕我直言。 @BasileStarynkevitch:这可以防止将 back 转换为原始类型。为了解决您的第一条评论,static_cast&lt;void*&gt; 可能会给您一个指向完整对象中间某处的基类的指针,该基类可能不是唯一的。【参考方案2】:

当你有类似的东西时:

template<typename X, typename Y>
bool operator==(const X* px, const Y* py) 
     return dynamic_cast<void*>(px) == dynamic_cast<void*>(py);

【讨论】:

这里不是多余的return吗? 而你正在抛弃const

以上是关于dynamic_cast<void*> 啥时候有用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

dynamic_cast

是否将两个 void 指针与 C++ 中定义的不同对象进行比较?

我应该使用 dynamic_cast<T> 进行复制吗?

什么可能导致 dynamic_cast 崩溃?

为啥虚函数调用比dynamic_cast快?

C++中的dynamic_cast和static_cast