免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: demilich
打印 上一主题 下一主题

[C++] 请教个关于多态的问题 [复制链接]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
11 [报告]
发表于 2015-08-19 16:44 |只看该作者
回复 11# windoze


    dynamic_cast 说是在无法使用 virtual 函数的时候用, 能用 virtual 函数的时候应该交给 dynamic binding 去搞定.

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
12 [报告]
发表于 2015-08-20 14:52 |只看该作者
1、这个情况dynamic_cast不是必须的,C方式转型通常能干除了dynamic_cast以外其他所有cast(大不了多转几次),而且转型没有“出错”的说法。dynamic_cast也只是转不了就是NULL,既不会编译“出错”,也不会链接“出错”,亦不会执行“出错”,除非你故意去访问错误指针里面的内容。
2、这个情况只是打印了错误对象中的x的值,由于子类比父类占用字节数较大,所以是越界访问了。由于这个越界访问没有写入过程,不会破坏内存块原有数据,通常是不容易出错的,除非这个对象刚好被分配到一页的最末尾,而下一页却不可读,这样越界了去读取不可读的内存地址才会出错。如果e函数里面有对x有写操作,由于只越界了4个字节,通常该地址也是可写的(除非也是一页最末尾而下页不可写),但是写入数据后将会破坏内存块原有数据内容。这样虽然这次不会立刻出错,但是隐患却一直存在,再在以后多次new、delete、malloc、free之后的某次如果需要依赖该块数据原有内容的时候就可能出错了,而且那时候再去查问题就很难再找到问题的源头。通常如果某个程序经常出现delete或free出错,new、malloc分配不出内存但实际可用内存还很多,那么一定是在这之前存在了一次对new或者malloc分配出的内存进行过越界写入操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP