條款32:確定public繼承中塑造出來的是ISA關系而不是其他的關系

首先考虑的是一个很典型的关系,就是矩形与正方形的关系:

 1 class Recantagle{
 2     virtual void setHeight(int);
 3     virtual void setWidth(int);
 4     virtual int height(int)const;
 5     virtual int width(int)const;
 6     ...
 7 };
 8 void makeBigger(Recantagle & r)
 9 {
10     int oldHeight = height();
11     setWidgth(wid);
12     assert(height() == oldHeight);
13 }
上面的makeBigger主要为了保证在makeBigger的过程高度,不会受到改变。
 
但是在继承体系中,一个正方形的width改变的时候,起height同样也会受到改变,所以上面这项继承实际上是不合理的。
 
所以从某种方面来说,平时在我们眼中可能理所应当的懂事实际上在继承体系中并不一定能够实现。这里的主要问题是并非一个矩形所拥有的性质对于一个正方形来说都是存在的,所以一般的我们所说的正方形是一个矩形实际上只是英语上的is-A关系而不是实际上继承体系中的is-a关系。
 
小结: “public”继承意味着 is-a的关系,基于base-class上的每一件事情都应该在derived-class上面成立

 

更多相关文章
一周排行