dynamic_cast of void *

时间:2011-07-21 06:14:10

标签: c++

我需要使用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)。

3 个答案:

答案 0 :(得分:13)

除非变量的原始类型具有vtable(即具有虚函数),否则不能使用动态强制转换。这是因为dynamic_cast需要运行时类型信息,该信息记录在vtable中;如果vtable丢失,编译器不知道对象是什么类型。

您应该使用虚拟析构函数声明基类,并使用指向此基类的指针而不是void *

答案 1 :(得分:2)

如果您必须将对象作为void *传递,那么您应该使用

delegateClass *delegate = static_cast<delegateClass*>(((MYClass*))target);

因为void *targetdelegateClass之间没有阶级关系。在这里,您说您知道目标_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 ++以获得更多有关此问题的见解。我希望这将有所帮助。 :)