6-继承与多态性.ppt
文本预览下载声明
*;继承性和多态性;继承性和多态性;
新问题:如何扩展?
1)类的扩展:深大计算机与软件学院成立,为给计算机与软件学院学生创造好的学习环境,学校规定,软件学院新生可以在宿舍装电脑,如何修改宿舍管理系统?
2)类的抽象:不准养狗-不准养宠物
;
新问题:如何扩展?
3)此类问题的特点:类与类之间存在IS-A关系
软件学院新生也是一类新生,但其行为与一般的新生有所不同(更准确的说是有所扩展)
狗是宠物,猫是宠物,小强也是宠物——“宠物”概念的提出,可以使狗、猫、小强…等的一些共同性的行为被提取出来
;
1.继承及其重要性
1)自然界的继承
;
2)一个继承的关系(上图水果的继承关系)
苹果是一种水果(苹果继承了水果的共性行为);
国光苹果是一种苹果(国光苹果继承了苹果的共性行为);
??? 梨是一种水果;??? 雪梨是一种梨;
??? 蕉是一种水果;??? 香蕉是一种蕉;;3)“IS-A”关系:表示了一种继承关系。相当于,苹果是一种水果,梨是一种梨;苹果是一种水果:苹果具有水果共同有的特点,同时兼有苹果所特有的特点。
4)“HAS-A”关系:描述了一种聚集关系(组成关系) 。例如:水果由果皮、果肉、果核等组成。
;6)计算机应用中的实际问题
类的封装形式为用户提供了一种自定义数据类型。随着用户需求的变动,原来的数据类型可能无法满足用户的新要求;按照传统程序设计方法,就要改写(甚至重写)这些前面定义的数据类型。由于改写了数据类型,用户原来的程序就很可能无法使用。
;面向对象程序设计致力于解决此类问题。它提供“继承”这种机制,通过继承机制,可以方便地把这些原有程序进行改造,扩充,达到用户的新要求
用户不必直接修改(更不必重写)原有的程序,而是利用系统所提供的“继承”定义,使用原来定义的数据类型,方便地定义出新的数据类型。
这样,不仅能重用原来的程序,而且还能不断扩展新的程序,适应用户需求的变化。;*;*;C++继承形式主要有单重继承、多重继承等两种。如下图所示:;*;*;派生类定义举例 ;*;派生类分为两大部分: 一部分是从基类继承来的成员,另一部分是在声明派生类时增加的部分。
每一部分均分别包括数据成员和成员函数。;
;构造一个派生类包括以下3部分工作:
(1) 从基类接收成员。派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。
要求我们根据派生类的需要慎重选择基类,使冗余量最小。事实上,有些类是专门作为基类而设计的,在设计时充分考虑到派生类的要求。
(2) 调整从基类接收的成员。接收基类成员是程序人员不能选择的,但是程序人员可以对这些成员作某些调整。;(3) 在声明派生类时增加的成员。这部分内容是很重要的,它体现了派生类对基类功能的扩展。
此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。;既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题。
在建立派生类的时候,并不是简单地把基类的私有成员直接作为派生类的私有成员,把基类的公用成员直接作为派生类的公用成员。
对基类成员和派生类自己增加的成员是按不同的原则处理的。;(1) 基类的成员函数访问基类成员?
(2) 派生类的成员函数访问派生类自己增加的成员?
(3) 基类的成员函数访问派生类的成员?
(4) 派生类的成员函数访问基类的成员?
(5) 在派生类外访问派生类的成员?
(6) 在派生类外访问基类的成员?;继承成员的访问控制规则;类定义中的“访问控制”的含义;;公有继承;;;保护成员;保护继承;*;*;私有继承;*;*;*;*;*;派生类的构造函数 ;;;;;;;*;*;;*;*;练习;;赋值兼容原则;;;*;*;*;;多态性;多态性;*;*;*;什么是虚函数 ;*;*;*;;;虚析构函数
#includeiostream
using namespace std;
class A
{
public:
A(){cout“Constructing Aendl;}
virtual ~A(){coutDestructing Aendl;}
};
class B:public A
{
public:
B(){cout“Constructing Bendl;}
~B(){coutDestructing Bendl;}
};
;;*;*;*;;*;多重继承;*;*;多重继承派生类的构造函数;*;多重继承派生类的构造函数;多重继承派生类的析构函数;*;;;;C++关于重复继承的基本规则
(1)一个类必须完全定义后才可以作为基类--无法直接或间接让一个类继承自己(不能递归)
(2)不允许
显示全部