我需要使用dynamic cast void *
void *target = (MYClass*)target;//I am storing initially(to implment delegate mechanism)
....
delegateClass *delegate = dynamic_cast<delegateClass*>(target);
给出错误无法转换void *,我不能使用下面的代码...因为它是委托机制
delegateClass *delegate = dynamic_cast<delegateClass*>(((MYClass*))target);
如何获取目标类型并实现...如果我使用typeid(),我可以得到类的名称但是如何在上面的等式中使用typeid而不是(((MYClass *))target)。
答案 0 :(得分:13)
除非变量的原始类型具有vtable(即具有虚函数),否则不能使用动态强制转换。这是因为dynamic_cast需要运行时类型信息,该信息记录在vtable中;如果vtable丢失,编译器不知道对象是什么类型。
您应该使用虚拟析构函数声明基类,并使用指向此基类的指针而不是void *
。
答案 1 :(得分:2)
如果您必须将对象作为void *
传递,那么您应该使用
delegateClass *delegate = static_cast<delegateClass*>(((MYClass*))target);
因为void *target
和delegateClass
之间没有阶级关系。在这里,您说您知道目标_is_a_ delegateClass。
然而,这个习惯用法通常用于通过标准C接口传递代码并返回。
答案 2 :(得分:0)
我处于类似情况并正在学习c ++风格类型转换。我提到了这个llink http://www.cplusplus.com/doc/tutorial/typecasting/
我可以解释的是,dynamic_cast的目的是确保类型转换的结果是所请求类的有效完整对象。因此,当我们尝试从派生类转换为基类时,转换是平滑的。但反之亦然。
class CBase { };
class CDerived: public CBase { };
CBase b; CBase* pb;
CDerived d; CDerived* pd;
pb = dynamic_cast<CBase*>(&d); // ok: derived-to-base
pd = dynamic_cast<CDerived*>(&b); // wrong: base-to-derived
现在为了工作,基类应该是多态的,即它应该具有虚函数。当一个类是多态的时,dynamic_cast在运行时执行特殊检查,以确保表达式产生所请求类的有效完整对象。看看这里。
class CBase { virtual void dummy() {} };
class CDerived: public CBase { int a; };
int main () {
try {
CBase * pba = new CDerived;
CBase * pbb = new CBase;
CDerived * pd;
pd = dynamic_cast<CDerived*>(pba);
if (pd==0) cout << "Null pointer on first type-cast" << endl;
pd = dynamic_cast<CDerived*>(pbb);
if (pd==0) cout << "Null pointer on second type-cast" << endl;
} catch (exception& e) {cout << "Exception: " << e.what();}
return 0;
}
这里代码尝试从类型为CBase *(pba和pbb)的指针对象执行两个动态转换,转换为CDerived *类型的指针对象,但只有第一个成功。尽管两者都是CBase *类型的指针,但pba指向CDerived类型的对象,而pbb指向CBase类型的对象。因此,当使用dynamic_cast执行它们各自的类型转换时,pba指向类CDerived的完整对象,而pbb指向类CBase的对象,这是类CDerived的不完整对象,因此它返回一个空指针表明失败。
所以我建议你使用static_cast,它提供双向类型转换,即从派生到基类,也从派生到基类。但是在这种情况下,程序员需要确保转换是安全的,因为在运行时不执行类型检查,就像dynamic_cast一样。
在你的代码中要么使目标指向转换之前的类对象(但要确保Myclass是多态的),否则你可以去static_cast。
这个解释基于我最近关于该主题的阅读,我建议您参考Effective C ++以获得更多有关此问题的见解。我希望这将有所帮助。 :)