C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章

上传人:w****i 文档编号:94523347 上传时间:2019-08-08 格式:PPT 页数:237 大小:789.50KB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章_第1页
第1页 / 共237页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章_第2页
第2页 / 共237页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章_第3页
第3页 / 共237页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章_第4页
第4页 / 共237页
C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章_第5页
第5页 / 共237页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 李兰_第5章(237页珍藏版)》请在金锄头文库上搜索。

1、5.1 继承与派生(Inheritance and Derivation) 5.2 派生类的访问控制(Derived Classes Access Control) 5.3 派生类的构造函数与析构函数 (Derived Classes Constructors and Destructors) 5.4 多继承(Multi-Inheritance) 5.5 虚基类(Virtual Base Classes) 5.6 赋值兼容规则(Compatible Assignment Rules) 5.7 程序举例(Program Examples) 5.8 常见编程错误(Common Programmin

2、g Errors) 本章小结(Chapter Summary) 习题5(Exercises 5),5.1.1 继承的概念(Inheritance Concept) 1继承的含义 在自然界中,猴子是灵长目的一大类,金丝猴具有猴子的共有特征,同时又有不同于其他猴子的漂亮的金色猴毛;现实生活中,子女的外貌、血型往往不是仅仅继承自父亲或母亲,而是将父母亲的特点都继承下来。,5.1 继 承 与 派 生 (Inheritance and Derivation),2继承的种类 每一个派生类都有且仅有一个基类,派生类可以看作是基类的特例,它增加了某些基类所没有的性质。这种继承方式称为单继承或单向继承。派生类又

3、作为基类继续派生新的类, 这样的派生方式称为多层派生,从继承的角度称为多继承,与之相类似,如果一个派生类有两个或两个以上的基类,则称为多继承或多重继承。如图5-1所示。,图5-1 单继承和多继承,3继承机制的特点 通过继承机制,可以利用已有的数据类型来定义新的数据类型,所定义的新的数据类型不仅拥有新定义的成员,而且同时还拥有旧的成员。,C+的继承关系有以下几个特点: (1) 一个派生类可以有一个或多个基类,只有一个基类时,称为单继承;有多个基类时,称为多继承。 (2) 继承关系可以是多级的,即类Y继承类X和类Z继承类Y可以同时存在。 (3) 不允许继承循环,例如,不能有类Y继承类X、类Z继承类

4、Y和类X继承类Z同时存在。 (4) 基类中能够被继承的部分只能是公有成员和保护成员(具体概念将在后面介绍),私有成员不能被继承。,5.1.2 派生类的声明(Declaration of Derived Classes) 1单继承的定义 单继承的定义格式如下: class: ; ;,【例5-1】 在普通的时钟类Clock基础上派生出闹钟类AlarmClock。 程序如下: #include using namespace std; class Clock private: int H,M,S; public:,void SetTime(int H=0,int M=0,int S=0); void

5、 ShowTime(); Clock(int H=0,int M=0,int S=0); Clock(); ; class AlarmClock: public Clock private:,int AH,AM; /响铃的时间 bool OpenAlarm; /是否关闭闹钟 public: SetAlarm(int AH, int AM); /设置响铃时间 SwitchAlarm(bool Open=true); /打开/关闭闹铃 ShowTime(); /显示当前时间与闹铃时间 派生类AlarmClock的成员构成图如图5-2所示。,图5-2 派生类AlarmClock的成员构成图,2派生类

6、的实现方式 1) 吸收基类成员 基类的全部成员被派生类继承,作为派生类成员的一部分。 2) 改造基类成员 派生类根据实际情况对继承自基类的某些成员进行限制和改造。 3) 添加新成员 派生类在继承基类成员的基础之上,根据派生类的实际需要,增加一些新的数据成员和函数成员,以描述某些新的属性和行为。,3多继承的定义 多继承可以看做是单继承的扩充,它是指由多个基类派生出一个类的情形。 多继承的定义格式如下: class 派生类名:继承方式1 基类名1, 继承方式2 基类名2, private: 派生类的私有数据和函数 public: 派生类的公有数据和函数 protected: 派生类的保护数据和函数

7、 ;,4基类与派生类的关系 任何一个类都可以派生出一个新类,派生类也可以再派生出新类,因此基类和派生类是相对而言的。一个基类可以是另一个基类的派生类,这样便形成了复杂的继承结构,出现了类的层次。一个基类派生出一个派生类,它又变成另一个派生类的基类,则原来基类为该派生类的间接基类,其关系如图5-3所示,其中,类是类的间接基类,而类是类的直接派生类。,图5-3 类的层次,1) 派生类是基类的具体化 类的层次通常反映了客观世界中某种真实的模型。例如,定义输入设备为基类,而键盘和鼠标将是派生类,它们的关系图如图5-4所示。在这种情况下不难看出,基类是对若干个派生类的抽象,而派生类是基类的具体化。基类抽

8、取了它的派生类的公有特征,而派生类通过增加行为将抽象类变为某种有用的类型。,图5-4 继承的实例,2) 派生类是基类定义的延续 先定义一个抽象基类,该基类中有些操作并未实现,然后定义非抽象的派生类,实现抽象中基类中定义的操作。 3) 派生类是基类的组合 在多继承时,一个派生类有多于一个的基类,这时派生类将是所有基类行为的组合。,5.2.1 公有继承(Public Inheritance) 若在定义派生类时,继承方式为public,则定义公有派生。,5.2 派生类的访问控制 (Derived Classes Access Control),【例5-2】 用学生档案类Student派生学生成绩类S

9、core。讨论基类中公有、私有与保护数据成员在派生类中的访问权限。 程序如下: # include using namespace std; class Student ,private: int No; /定义No为私有数据成员 protected: int Age; /定义Age为保护的数据成员 public: char Sex; /定义Sex为公有数据成员 Student(int no,int age,char sex) /定义类Student的构造函数, No=no;Age=age;Sex=sex; int GetNo() return No; /返回No的公有成员函数 int Get

10、Age() return Age; /返回Age的公有成员函数 void ShowS() /显示No、Age、Sex的公有成员函数 cout“No=“Not“Age=“Aget“Sex=“Sexendl; ; class Score : public Student /由基类Student公有派生出子类Score, private: int Phi,Math; /定义类Score的私有数据成员 public: Score(int n,int a,char s,int p,int m):Student(n,a,s) /类Score的构造函数 Phi=p;Math=m; void Show(voi

11、d) /显示类Score与其父类Student的数据成员值 cout“No=“GetNo()t“Age=“Aget“Sex=“Sex,t“Phi=“Phit“Math=“Mathendl; ; void main(void) Score s (101,20,M,90,80); /用类Score定义一个对象s s.ShowS(); /类Score的对象s调用基类公有函数 ShowS(),s.Show(); /类Score的对象调用公有函数Show() cout“No=“s.GetNo()t“Age=“s.GetAge()t“Sex=“s.Sexendl; ,程序执行后输出: No=101 Age

12、=20 Sex=M No=101 Age=20 Sex=M Phi=90 Math=80 No=101 Age=20 Sex=M 从例5-2可以看出,基类Student中的私有数据成员No、保护数据成员Age、公有数据成员Sex在基类中可直接使用,如在基类Student的公有显示函数中: void ShowS() cout“No=“Not“Age=“Aget“Sex=“Sexendl; ,基类Student中的私有数据成员No在派生类Score中不能直接使用,而只能通过公有接口函数GetNo()访问。如派生类Score的公有显示函数中: void Show( void) cout“No=“Ge

13、tNo()t“Age=“Aget“Sex=“Sex t“Phi=“Phit“Math=“Mathendl; ,5.2.2 私有继承(Private Inheritance) 私有继承的特点是基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问。 由于基类中的公有成员Sex、ShowS()与保护成员Age在派生类Score中变为私有成员,因此在类外不能用Score的对象s直接访问。因而编译上例程序时,下列语句会出现编译 错误。 s.ShowS(); cout“No=“s.GetNo()t“Age=“s.GetAge()t“Sex=“s.Sexendl;,5.2.3 保

14、护继承(Protected Inheritance) 保护继承的特点是基类的所有公有成员和保护成员都作为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。 将上述3种不同的继承方式的基类特性与派生类特性列出表格,见表5-1。,表5-1 不同继承方式的基类和派生类特性,【例5-3】 访问基类和派生类的函数。 公有继承方式、单继承的例子,程序如下: #include using namespace std; class Point /定义基类 public: void setxy(int myx,int myy)X=myx;Y=myy; void movexy(

15、int x,int y)X+=x;Y+=y; protected: int X,Y;,; class Circle : public Point /定义派生类,公有继承方式 public: void setr(int myx,int myy,int myr) setxy(myx,myy);R=myr; void display(); protected: int R; ;,void Circle:display() cout“The postion of center is “; cout“(“X“,“Y“)“endl; cout“The radius of Circle is “Rendl; int main() Circle

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号