对dynamic_cast有疑问…… 怎么指针类型也会影响到结果的

DarknessTM 2009-02-24 11:11:40

void CWnd::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// 消息是由CSliderCtrl 引发的
CSliderCtrl * pControl = dynamic_cast<CSliderCtrl *>(pScrollBar); // 结果是NULL
CSliderCtrl * pControl2 = dynamic_cast<CSliderCtrl *>((CWnd*)pScrollBar); // 结果是非NULL

// 为什么会这样? 指针的值没有任何变化啊

}


VS2008 SP1
...全文
152 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bfhtian 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 DDGG 的回复:]
看看项目属性里C++编译选项里是否启用了RTTI。
[/Quote]
启动了也不对,3楼正解
DDGG 2009-02-24
  • 打赏
  • 举报
回复
看看项目属性里C++编译选项里是否启用了RTTI。
arong1234 2009-02-24
  • 打赏
  • 举报
回复
依赖于dynamic_cast的实现,有时可能就是编译器没有很好的满足标准要求,在看到类型明显不匹配时,根本不去检查RTTI
[Quote=引用 2 楼 DarknessTM 的回复:]
dynamic_cast 不是根据 RTTI 来实现的么, 那为什么还要关注指针类型? 没有道理啊
[/Quote]
waizqfor 2009-02-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 a_rockboy 的回复:]
dynamic_cast是运行时动态类型识别。
pScrollBar的类型是CScrollBar *,CScrollBar * 与CSliderCtrl * 是不能类型转换的。
(CWnd*)pScrollBar的类型是CWnd *,CWnd * 与CSliderCtrl * 是可以类型转换的。
[/Quote]
呵呵 没错~~
tangshuiling 2009-02-24
  • 打赏
  • 举报
回复

dynamic_cast是一种运行期转换机制,主要用于基类与派生类之间的类型转换,dynamic_cast是一种安全的类型转换机制,转换不成功的直接就NULL了
Chevin 2009-02-24
  • 打赏
  • 举报
回复
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
a_rockboy 2009-02-24
  • 打赏
  • 举报
回复
dynamic_cast是运行时动态类型识别。
pScrollBar的类型是CScrollBar *,CScrollBar * 与CSliderCtrl * 是不能类型转换的。
(CWnd*)pScrollBar的类型是CWnd *,CWnd * 与CSliderCtrl * 是可以类型转换的。
DarknessTM 2009-02-24
  • 打赏
  • 举报
回复
dynamic_cast 不是根据 RTTI 来实现的么, 那为什么还要关注指针类型? 没有道理啊
arong1234 2009-02-24
  • 打赏
  • 举报
回复
dynamic_cast不仅仅关注值,也关注其真实的类型。CScrollBar和CSliderCtrl没有直接的继承关系吧?这样转换永远是null了

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧