inheritance

inheritance


继承


is-a

【例3-4】Clock & AlarmClock

class Clock{
public:
    void setTime(int h,int m);
    void dispTime();
};
class AlarmClock:public Clock{
public:
    void setAlarm(int h,int m);
    bool checkAlarm();
    void stopAlarm();
    void clearAlarm();
};

【课堂练习3-4】

Person


Student


Teacher


CourseRep(科代表)

【例3-5】某图形系统,包含多种图形类Circle、Rect、Line、Point等


能否统一管理?

Shape & Circle

class Shape{};

class Circle:public Shape{
public:
    Circle(Point center,float r);
    float area(){
        return Pie * r * r;
    }
private:
};

Shapes

class Shape{
public:
    Shape(char type):type(type){};
    char getType(){return type;};
private:
    char type;
};

class Circle:public Shape{
public:
    Circle(Point center,float r):center(center),r(r),Shape(0);//0表示Circle
    float area(){
        return Pie * r * r;
    }
};

Shapes 优化

class Shape{
public:
    virtual void show(){};  //虚函数
    virtual float area(){return 0.0};
};

class Circle:public Shape{
public:
    Circle(Point center,float r):center(center),r(r){};
    virtual void show(){...}
    float area(){
        return Pie * r * r;
    }
};

Shapes 优化

int  main(){
    Shape * shapes[100];
    shapes[0]=new Circle(0,0,10);
    shapes[1]=new Rect(1,1,10,5);
    ...
    float totalArea = 0;
    for(int i=0;i<100;i++){
        totalArea += shapes[i]->area();
    }
    cout<<totalArea;
    
    return 0;
}

虚函数多态的条件


  1. public 继承

  2. 基类中定义virtual函数

  3. 子类override(覆写)该函数(函数原型与基类完全相同)

  4. 通过基类指针(或引用)指向子类对象实例

  5. 通过基类指针(或引用)调用虚函数

Shapes 优化

class Shape{  //抽象类
public:
    virtual void show() = 0; //纯虚函数
    virtual float area() = 0;
};

Open-Close(开闭原则)


对修改关闭


对扩展开放

【例3-6】电路开关

int main(){
    Button button;
    Fan fan;
    Door door;
    
    button.bind(fan);
    button.on(); //风扇开始转动
    button.off(); //风扇停止转动
    ...
    button.bind(door);
    button.on(); //开门
    button.off(); //关门
}

电路开关

class Button{
public:
    void bind(Switchable target);
    void on();
    void off();
};
class SwitchAble{
public:
    virtual void on() = 0;
    virtual void off() = 0;
};
class Fan:public SwitchAble{
public:
    virtual void on(){
        cout<<"风扇转动";
    }
    virtual void off(){
        cout<<"风扇停止转动";
    }
};

class Door:public SwitchAble{
public:
    virtual void on(){
        cout<<"开门";
    }
    virtual void off(){
        cout<<"关门";
    }
};

Abstract Server


抽象工厂模式

Abstract Server应用示例


Virtual


虚的, 实质的,  事实上的
almost;
something is so nearly
    that any difference is not important;
    

【课堂练习3-5】可随意切换算法的Sorter类

赋值兼容规则

Circle circle;

1) Shape* pShape = &circle ;

2) Shape& rShape = circle ;

RedCircle redCircle;

3) circle = redCircle ;

虚析构函数

The End

目录