在C++中,T q = dynamic_cast<T>(p);
构造执行指针p
到其他指针类型T
的运行时强制转换,这些指针类型必须出现在*p
动态类型的继承层次结构中才能成功。这一切都很好。
但是,也可以执行dynamic_cast<void*>(p)
,它只返回一个指向“派生最多的对象”的指针(参见C++11中的5.2.7::7 )。我知道这个特性在动态类型转换的实现中可能是免费的,但是它在实践中有用吗?毕竟,它的返回类型充其量是void*
,那么这有什么好处呢?
发布于 2011-11-14 23:48:39
dynamic_cast<void*>()
确实可以用来检查身份,即使处理多重继承也是如此。
尝试以下代码:
#include <iostream>
class B {
public:
virtual ~B() {}
};
class D1 : public B {
};
class D2 : public B {
};
class DD : public D1, public D2 {
};
namespace {
bool eq(B* b1, B* b2) {
return b1 == b2;
}
bool eqdc(B* b1, B *b2) {
return dynamic_cast<void*>(b1) == dynamic_cast<void*>(b2);
}
};
int
main() {
DD *dd = new DD();
D1 *d1 = dynamic_cast<D1*>(dd);
D2 *d2 = dynamic_cast<D2*>(dd);
std::cout << "eq: " << eq(d1, d2) << ", eqdc: " << eqdc(d1, d2) << "\n";
return 0;
}
输出:
eq: 0, eqdc: 1
发布于 2011-11-15 00:08:15
请记住,C++允许您使用旧的C方式来做事情。
假设我有一些API,其中我被迫通过类型void*
走私一个对象指针,但它最终被传递到的回调将知道它的动态类型:
struct BaseClass {
typedef void(*callback_type)(void*);
virtual callback_type get_callback(void) = 0;
virtual ~BaseClass() {}
};
struct ActualType: BaseClass {
callback_type get_callback(void) { return my_callback; }
static void my_callback(void *p) {
ActualType *self = static_cast<ActualType*>(p);
...
}
};
void register_callback(BaseClass *p) {
// service.register_listener(p->get_callback(), p); // WRONG!
service.register_listener(p->get_callback(), dynamic_cast<void*>(p));
}
错误的!代码是错误的,因为它在存在多重继承的情况下会失败(也不能保证在没有多重继承的情况下也能正常工作)。
当然,该应用编程接口不是很像C++风格,如果我继承自ActualType
,即使是“正确的”代码也可能出错。所以我不会说这是对dynamic_cast<void*>
的一个很好的使用,但它确实是一个使用。
发布于 2011-11-20 16:35:25
当我们将存储放回内存池时,它很有用,但我们只保留一个指向基类的指针。这种情况下,我们应该弄清楚原来的地址。
https://stackoverflow.com/questions/8123776
复制相似问题