关于stl所谓的强化概念和继承的区别杂谈

   最近开始学习stl源码相关的东西

   看到了书里特别指出说需要注意强化的概念,翻阅了些其他的资料,最后总结了下强化和继承的一些学习吧

   以前一直以为BidirectionIterator是继承于ForwardIterator的,也就是ForwardIterator的派生类,后来发现虽然是派生,但却不是

通常意义上的继承概念,而是所谓的“强化”,或者说是用BidirectionIterator是ForwardIterator的子类的手段来达成所需的目的

 一、继承

  所谓继承是is-a的关系(大家都知道),但是它有个很重要的隐式约定:它表示的是一种具体类型与另一种具体类型的关系。所谓具体类型,

是一个包括属性和给用户的方法的集合。

  例如:男人和女人都是人,都是人的派生类,那么男人和女人都拥有人的属性,比如说一个鼻子,一双眼睛

二、强化

   所谓强化,代表的是:一个集合与另一个集合的关系。所谓集合:是指满足一组相同条件的集合,或者说是拥有一组相同操作行为的集合。因而如果说B是A的强化,那么B也拥有集合A的该组操作能力,并且可能还拥有其他的能力。因而它强调的是接口能力的继承,而不是将属性和行为都继承下来。

   其实我觉得这不是stl的特性,应该说是stl利用模板提供的理念和手段来实现的。回忆一下简单的模板是怎么写的,就会容易理解集合的概念:

   例如:

   template<class T>

   class AddOperation

  {

        T  virtual Add(T  Value) {return m_Value + Value;}

        T m_Value;

  }

  T可以是int,可以是float等内置类型,也可以是用户自定义的类, 他们拥有相同的操作,就是可以Add,因而AddOperation可以被认为是一个拥有加法能力的集合

 

  template<class T>

   class CaculateOperation : public AddOperation<T>

  {

        T  virtual Subtract(T  Value) {return m_Value - Value;}

        T m_Value;

  }

  那么CaculateOperation被认为是AddOperation的强化,拥有了它的加法能力,但是自己又拥有减法能力。

  但是CaculateOperation不是真正意义的继承于AddOperation!

  例如:CaculateOperation的T可能是float,而AddOperation的T可能是int,那么不能认为float是int的继承吧!

  注:不过不太提倡模板滥用c++提供的继承手段,其实不是模板也要小心,很容易让代码一团糟,而且有的编译器也可能会存在bug(MS,很牛的公司,stl的set的部分用法都能在2005和2010上不兼容!所以模板不是那么容易用好的!感兴趣的话,可以发现stl不是通过这种继承手法来强化的,他是绕过去的,而且这样代码的可扩展性更好)

 

   因而严格意义上来说BidirectionIterator不是真正意义的继承ForwardIterator(其实内部是通过Bidirection_Iterator_tag和Forward_Iterator_tag来表示它具有的行为能力),只不过是拥有ForwardIterator的类似的行为

 

   PS:很少写博客,如果有疑问或者不对的,欢迎指出^_^

 

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值