条款 32 :确定你的public继承塑膜出is-a关系
Make sure public inheritance models "is-a"
-
public inheritance意味着"is-a"(是一种)的关系。如果B:😄,则在任何需要B的地方,D一样可以排上用场。但是需要D的地方,B不见得有用。例如所有学生都是人,人能干的事,学生一定能干,但学生有的属性不是人人都会有。
void eat(const Person& p);//任何人都会吃 void study(const Student& s);//学生才到校学习 Person p; Student s; eat(p);//没问题,p是人 eat(s);//没问题,student is a person study(p);//错误,学生才去学习 study(s);//没错,s是学生
-
乍一看,public继承是is a的关系很简单。但是有时候,你的直觉会欺骗你。例如你觉得:企鹅是一种鸟,也就是企鹅应该是鸟的public继承,但是鸟会飞,企鹅会飞吗?这里是由于语言不严谨造成的,应当有这么一个认知:不是所有鸟都会飞。所以当我们编写继承类时应该在鸟类中放入fly的虚函数,而在企鹅类中对fly不予实现。这样更能反应出真实的继承关系。再例如正方形应该继承长方形,毕竟从小学我们就知道,正方形是特殊的矩形。但是我们该仔细思考一下,长方形有长宽两个属性,我们对其都可以改变,而正方形只有边长这么一个属性,我们总不能设置两条边,可以向长方形一样对其其中一个随意修改,那就不是正方形了哇。因为我们说正方形is a 矩形,看似合理。但是我们应当更加仔细的考察其是不是不够严谨。
请记住
"public继承"意味is-a.适用于base-clases身上的每一件事也一定适用于derived classes身上,因为每一个derived classes对象也都是一个base class对象。