【问题标题】: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 如果你的析构函数是虚拟的,你就不需要最派生的类型,如果它不是虚拟的,那是你自己的错,无论如何你都搞砸了。

标签: c++ c++11 casting void-pointers dynamic-cast


【解决方案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
猜你喜欢
  • 1970-01-01
  • 2014-04-29
  • 2018-04-09
  • 1970-01-01
  • 2012-03-17
  • 2010-09-24
  • 2010-09-11
相关资源
最近更新 更多