继承一一派生类
继承--派生类
主要内容 继承的基本概念 ■单继承 ■消息的多态与动态绑定(虚函数) ·抽象类(纯虚函数) 多继承
主要内容 ◼ 继承的基本概念 ◼ 单继承 ◼ 消息的多态与动态绑定(虚函数) ◼ 抽象类(纯虚函数) ◼ 多继承
继承的基本概念 在开发一个新软件时,把现有软件或软件的一部分 拿过来用称为软件复用 目前,不加修改地直接复用已有软件比较困难。已 有软件的功能与新软件所需要的功能总是有差别的 解决这个差别有下面的途径: 0 修改己有软件的源代码,它的缺点是: 需读懂源代码 可靠性差、易出错 ■ 有时源代码难以获得 继承机制(Inheritance) 对一个面向对象的程序,在定义一个新的类时,先把已有程序 中的一个或多个类的功能全部包含进来,然后在新的类中再给 出新功能的定义或对已有类的某些功能重新定义。 不需要已有软件的源代码,属于目标代码复用!
继承的基本概念 ◼ 在开发一个新软件时,把现有软件或软件的一部分 拿过来用称为软件复用。 ◼ 目前,不加修改地直接复用已有软件比较困难。已 有软件的功能与新软件所需要的功能总是有差别的。 解决这个差别有下面的途径: • 修改已有软件的源代码,它的缺点是: ◼ 需读懂源代码 ◼ 可靠性差、易出错 ◼ 有时源代码难以获得 • 继承机制(Inheritance): ◼ 对一个面向对象的程序,在定义一个新的类时,先把已有程序 中的一个或多个类的功能全部包含进来,然后在新的类中再给 出新功能的定义或对已有类的某些功能重新定义。 ◼ 不需要已有软件的源代码,属于目标代码复用!
基类与派生类 ■在继承关系中存在两个类:基类(或称父类)和派生类 (或称子类)。派生类拥有基类的所有成员,并可以 。定义新的成员,或 对基类的一些成员(成员函数)进行重定义。 继承分为:单继承和多继承 。单继承:一个类只有一个直接基类。 。多继承:一个类有多个直接基类。 基类 基类1 基类n 派生类 派生类 单继承 多继承
基类与派生类 ◼ 在继承关系中存在两个类:基类(或称父类)和派生类 (或称子类)。派生类拥有基类的所有成员,并可以 • 定义新的成员,或 • 对基类的一些成员(成员函数)进行重定义。 ◼ 继承分为:单继承和多继承 • 单继承:一个类只有一个直接基类。 • 多继承:一个类有多个直接基类。 基类 派生类 派生类 基类1 … 基类n 单继承 多继承
继承对程序设计的支持 继承机制除了支持软件复用外,它还具有下面 的作用: ·对事物按层次进行分类。 图形 闭合图形 开放图形 多边形 椭圆形 折线 直线 弧线 矩形 三角形 圆形
继承对程序设计的支持 ◼ 继承机制除了支持软件复用外,它还具有下面 的作用: • 对事物按层次进行分类
·对概念进行组合。 研究生 教师 在职研究生
• 对概念进行组合。 研究生 教师 在职研究生
。支持软件的增量开发。(版本升级) A v1 A_v2 A v3
• 支持软件的增量开发。(版本升级) A_v1 A_v2 A_v3
单继承 在定义单继承时,派生类只能有一个直接基类, 其定义格式如下: class:[] { }: ·为派生类的名字。 为直接基类的名字。 是在派生类中新定义的成员,其中包括 对基类成员的重定义。 用于指出从基类继承来的成员在派生类中 对外的访问控制
单继承 ◼ 在定义单继承时,派生类只能有一个直接基类, 其定义格式如下: class :[] { }; • 为派生类的名字。 • 为直接基类的名字。 • 是在派生类中新定义的成员,其中包括 对基类成员的重定义。 • 用于指出从基类继承来的成员在派生类中 对外的访问控制
class A//基类 int X,Y; public: void f(); void g(); ; class B:public A/派生类 intz;/新成员 public: void h();/新成员
class A //基类 { int x,y; public: void f(); void g(); }; class B: public A //派生类 { int z; //新成员 public: void h(); //新成员 };
·派生类除了拥有新定义的成员外,还拥有基类的 所有成员(基类的构造函数和赋值操作符重载函 数除外)。例如: Bb; class A/基类 int x,y; b.x: public: b.y: void f(); b.z: void g(); 9 b.f); /A类中的f class B:public A/派生类 intz;/新成员 b.g(); /A类中的g public: b.h();/B类中的h void h();/新成员
◼ 派生类除了拥有新定义的成员外,还拥有基类的 所有成员(基类的构造函数和赋值操作符重载函 数除外)。例如: B b; b b.x: b.y: b.z: b.f(); //A类中的f b.g(); //A类中的g b.h(); //B类中的h class A //基类 { int x,y; public: void f(); void g(); }; class B: public A //派生类 { int z; //新成员 public: void h(); //新成员 };