查看: 1089|回复: 7

求助:dynamic_cast问题

[复制链接]

该用户从未签到

发表于 2014-11-19 11:25:51 | 显示全部楼层 |阅读模式
bool MyEventHandle::handle( const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa )
{
        osgViewer::Viewer *viewer = dynamic_cast<osgViewer::Viewer*>(&aa);
        return true;
}
osgGA::GUIActionAdapter &aa  是 osgViewer::Viewer *viewer 的父类,父类指针用dynamic_cast转换成子类指针,按理说viewer应该为NULL啊,但是我运行出来viewer是有地址的,怎么回事?

该用户从未签到

发表于 2014-11-26 14:29:12 | 显示全部楼层
osg内部循环frame()操作,在调用eventtraversal()时会调用,各事件处理器handler()进行处理,而其参数就是主视景器viewer,,所以aa就是viewer

该用户从未签到

发表于 2015-2-24 21:08:57 | 显示全部楼层
我也想问楼主的问题

该用户从未签到

发表于 2015-2-24 21:20:40 | 显示全部楼层
这里为什么父类向子类cast没有风险呢

该用户从未签到

发表于 2015-2-24 21:28:35 | 显示全部楼层
是不是这个dynamic_cast有什么特别之处来保证这个向下转型的安全

该用户从未签到

发表于 2015-3-3 18:12:41 | 显示全部楼层
因为你传参实际上是 osgViewer::Viewer 类,传入时转成了父类的。

该用户从未签到

发表于 2015-3-5 09:52:47 | 显示全部楼层
dynamic_cast是带安全检查的强制类型转换,如果括号中的参数(&aa),不是你要转换的类型的话,osgViewer::Viewer,会报错

该用户从未签到

发表于 2015-4-8 13:31:24 | 显示全部楼层
6楼正解!因为你参数传入的 aa 实际上是osgViewer::Viewer 所以在做动态转换时 可以从 父类转换成子类。要是 传入的是其他的派生类 那么这里做动态转换出来的结果就是NULL
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表