演员和:从父级到子级

时间:2012-01-31 15:18:14

标签: c++ casting

我有2个类:hObject,Drawer。抽屉继承自hObject。

使用此代码我通过id:

来检索特定对象
hObject * foundObj = hManager::getInstance()->getObject("drawer_id");

现在我想正确地将foundObj从hObject转换为Drawer。用:

vector<int> points = ((DrawerWidget *)hObject)->getPoints();

我重温

  

在')'令牌之前预期的主要表达

那么动态演员呢?

考虑:我的技能已经减半,直到我开始使用c ++

2 个答案:

答案 0 :(得分:3)

两个问题:

  • 您在写hObject(对象名称)
  • 时写了foundObj(类型名称)
  • 它是一个指针,所以你需要转换为指针类型(更新:问题已被编辑以修复它)。

修复它,并使用不太危险的C ++样式转换,以下应该可以工作:

vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();
  

那么动态演员呢?

如果基类是多态的(即至少有一个虚函数),那么那将更安全 - 你可以在运行时检查强制转换是否有效:

if (DrawerWidget * dw = dynamic_cast<DrawerWidget*>(foundObj)) {
    vector<int> points = dw->getPoints();
} else {
    // not a DrawerWidget
}

虽然如果你发现自己这样做,我会考虑设计:重新设计基类以支持你想通过虚函数做什么,或者在编译时确保转换可能更合适是有效的。

答案 1 :(得分:3)

你不小心写了指针的类型,而不是名字:

vector<int> points = ((DrawerWidget *)hObject)->getPoints();
//                                    ^^^^^^^

你的意思是:

vector<int> points = ((DrawerWidget *)foundObj)->getPoints();
//                                    ^^^^^^^^

此外,为了获得巨大的胜利,更喜欢C ++风格的演员:

vector<int> points = (static_cast<DrawerWidget*>(foundObj))->getPoints();

最后,如果*foundObj可能实际 DrawerWidget,并且这些类型是多态的,请考虑 not 强制转换而是依靠虚拟调度。