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<void*>
?
【问题讨论】:
以下是 MSalters 描述的示例:ideone.com/84U5ax 我认为分配器可以利用这一点(内存管理)。例如。如果你需要一块内存的起始地址,但你只有一个指向基类的指针。 @dyp:如果你已经有一个对象,它的内存必须已经分配,所以分配器不能再次分配它。对于解除分配,您需要的不仅仅是基地址,还需要派生最多的类型,以便可以运行所有析构函数。 @MSalters 如果你的析构函数是虚拟的,你就不需要最派生的类型,如果它不是虚拟的,那是你自己的错,无论如何你都搞砸了。 【参考方案1】:一个常见的原因是要弄清楚IA*
和IB*
两个接口是否实际上是指向同一个底层对象的指针。如果需要,请使用演员表。
IIRC,在具有重复非虚基的多重继承的情况下,甚至有可能有两个比较不相等的 IA*
指针,但指向同一个对象 - 因为它们指向两个不同的 IA
子对象。
【讨论】:
我不明白dynamic_cast<void*>(ptr)
和static_cast<void*>(ptr)
有什么区别(因为void*
没有任何RTTI 或vtable)....
@BasileStarynkevitch ptr
是一个指向类类型的指针,所以它可以有RTTI。
那么,void*
是一个通用指针,所以没有任何 RTTI,恕我直言。
@BasileStarynkevitch:这可以防止将 back 转换为原始类型。为了解决您的第一条评论,static_cast<void*>
可能会给您一个指向完整对象中间某处的基类的指针,该基类可能不是唯一的。【参考方案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*> 啥时候有用? [复制]的主要内容,如果未能解决你的问题,请参考以下文章