注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天地不仁,以万物为Googol!

天行有常,不以物喜,不以己悲……

 
 
 

日志

 
 

重载……  

2007-06-13 22:44:26|  分类: 积累 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
话说有这样的一族函数:

void insert(BaseWidget* w,  int i = -1);
void insert(ThinWidget* w,  int i = -1);
void insert(ThickWidget* w, int i = -1);
void insert(BigWidget* w,   int i = -1);
void insert(SmallWidget* w, int i = -1);

其中xWidget都继承自BaseWidget。这些函数大体功能都一样,只是细微上有一点差别,比如要对BigWidget重新做布局,或者设置ThickWidget的边框。

然后,有人把这些东西改成:
void insert(BaseWidget* w,  int i = -1);
void insert(ThinWidget* w,  int i);
void insert(ThickWidget* w, int i);
void insert(BigWidget* w,   int i);
void insert(SmallWidget* w, int i);

结果会怎么样呢?

那就是,所有忽略i值的调用都会自动转向:
insert(BaseWidget* w,  int i = -1)

编译不会出错,运行不会出错,行为…………自然就出错了………………

原因是,如果有ThinWidget *thinW,那么调用:
insert(thinW)

最初的设计会调用重载:
void insert(ThinWidget* w,  int i = -1)

但如过按照后来的设计,由于最后一个参数i没有默认值,调用也就无法匹配到正确的函数,只好退而求其次,寻找父类匹配,结果就调用到了:
void insert(BaseWidget* w,  int i = -1)

考虑到C++一般是定义声明分离,而且默认参数的定义是写在声明里,所以,你就等着一头雾水的解Bug吧。

我这两天就闷了几头雾水解这个bug,查到结果后,郁闷死了,那些声明是另一个同事改的,说是为了明确函数声明……

Orz
  评论这张
 
阅读(259)| 评论(3)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017