最近开始学习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:很少写博客,如果有疑问或者不对的,欢迎指出^_^