dynamic_cast<void*> 何时有用?

27

5.2.7/7的大意是:

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

这个语法有什么好的应用场景?什么情况下应该使用dynamic_cast<void*>呢?


这是MSalters所描述的示例:http://ideone.com/84U5ax - Vaughn Cato
我认为分配器可以利用这个(内存管理)。例如,如果您需要一个内存块的起始地址,但只有一个指向基类的指针。 - dyp
如果您已经有一个对象,那么它的内存必须已经分配好了,因此分配器不能再次分配它。而对于释放内存,您需要的不仅仅是基地址,还需要最派生类型,以便您可以运行所有析构函数。 - MSalters
如果你的析构函数是虚拟的,你就不需要最终派生类型;如果它不是虚拟的,那么这是你自己的问题,你已经完蛋了。 - n. m.
2个回答

28

一个常见的原因是确定两个接口 IA*IB* 是否实际上是指向同一基础对象的指针。如果需要这样做,请使用类型转换。

如果存在多重继承并具有重复的非虚拟基类,在两个IA*指针比较不相等但指向同一对象的情况下也是可能的,因为它们指向两个不同的 IA 子对象。


1
我不明白dynamic_cast<void*>(ptr)static_cast<void*>(ptr)之间有什么区别(因为void*没有任何RTTI或虚表)。 - Basile Starynkevitch
@BasileStarynkevitch ptr 是指向类类型的指针,因此它可以具有 RTTI。 - Oktalist
所以,void*是一个通用指针,因此没有任何RTTI,我个人认为。 - Basile Starynkevitch
2
这会防止向原始类型的回转换。至于您的第一个评论,static_cast<void*> 可能会给您一个指向完整对象中间某个基类的指针,这可能不是唯一的。 - MSalters

6

当你有这样的内容:

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

1
这里不是多余的 return 吗? - Morwenn
而且你正在放弃const - Oktalist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接