dynamic_cast of void *

  • 本文关键字:void of cast dynamic c++
  • 更新时间 :
  • 英文 :


我需要使用动态强制转换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*))目标。

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

你应该用虚析构函数声明一个基类,并且使用指向这个基类的指针,而不是使用指向void *的指针。

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

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

表示void *targetdelegateClass之间不存在类关系。这里你说你知道target _is_a_ delegateClass。

然而,这种习惯用法通常用于通过标准C接口传递代码并返回。

我也有类似的情况,正在学习c++风格的类型转换。我参考了这个链接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那样在运行时执行类型检查。

在这里的代码中,要么在转换之前使target指向委托类对象(但确保Myclass是多态的),否则您可以使用static_cast。

这个解释是基于我最近对这个主题的阅读,我建议你参考Effective c++来获得更多的见解。我希望这会有所帮助。:)

相关内容

最新更新