Effective C++ Item 32 确保你的 public 继承模子里出来 is-a 关联
本文senlie原版的,转载请保留此地址:http://blog.csdn.net/zhengsenlie
经验:"public继承"意味 is-a。适用于 base classes 身上的每一件事情一定也适用于 derived classes 身上,
由于每个 derived classes 身上,由于每个 derived class 对象也都是一个 base class 对象。
演示样例:
class Person {...}; class Student: public Person {...}; void eat(const Person &p); //不论什么人都会吃 void study(const Student &s); //仅仅有学生才到校学习 Person p; //p 是人 Student s; //s 是学生 eat(p); //ok p是人 eat(s); //ok s是学生。但学生也是(is-a)人 study(s); //ok s是学生 study(p); //error p不是学生
解析:上面的样例仅仅对 public继承才成立。 对private, protected 继承不成立。
public 继承的问题演示样例
1.企鹅是一种鸟。鸟会飞,但企鹅不会飞
class Bird{ public: virtual void fly(); //鸟能够飞 }; class Penguin: public Bird{ //企鹅是一种鸟 };
假设你的软件系统如今以及未来不须要差别会不会飞的鸟的话。
这种“双classes继承体系”就能够了,否则能够进行例如以下更改
class Bird{ //... -->没有声明 fly 函数,鸟不一定会飞 }; class FlyingBird: public Bird{ public: virtual void fly(); }; class Penguin: public Bird{ //... -->没有声明 fly 函数 };
2.class Square 应该以 public 形式继承 class Rectangle 吗?
class Rectangle{ virtual void setHeight(int newHeight); virtual void setWidth(int newWidth); virtual int height() const; //返回当前值 virtual int width() const; //... }; void makeBigger(Rectangle &r) //这个函数用以添加 r 的面积 { int oldHeight = r.height(); r.setWidth(r.width() + 10); //为 r 的宽度加10 assert(r.height() == oldHeight); //推断 r 的高度是否未曾改变 } class Square: public Rectangle {...}; Square s; //... assert(s.width() == s.height()); //这对全部正方形一定为真 makeBigger(s); //因为s 是一种(is-a)矩形。所以我们添加其面积。 assert(s.width() == s.height()); //对全部正方形应该仍然为真 --> 但其实因为上一步 makeBigger函数返回。这已经不是真的
版权声明:本文博主原创文章,博客,未经同意不得转载。