zoukankan      html  css  js  c++  java
  • 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函数返回。这已经不是真的

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    (九十三)蓝牙的基本使用
    (九十二)加速计的用法(过期方法+新方法)
    (九十一)距离传感器的使用
    1060. Are They Equal (25)
    (九十)使用多个storyboard+代码实现控制器的分开管理
    (八十九)用AutoLayout实现动画和Label根据内容自动调整
    HDU 2013:蟠桃记
    HDU 2050:折线分割平面
    HDU 2042:不容易系列之二
    HDU 1465:不容易系列之一
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4856668.html
Copyright © 2011-2022 走看看