C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计

上传人:E**** 文档编号:89381736 上传时间:2019-05-24 格式:PPT 页数:44 大小:1.68MB
返回 下载 相关 举报
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计_第1页
第1页 / 共44页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计_第2页
第2页 / 共44页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计_第3页
第3页 / 共44页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计_第4页
第4页 / 共44页
C++程序设计  教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计_第5页
第5页 / 共44页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 连卫民 何樱 韩彦锋 等 第10章 类继承的程序设计(44页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计,连卫民 主编,中国铁道出版社 2008.9,第10章 类继承的程序设计,本章主要内容: 10.1 类继承概述 10.2 单继承(重点) 10.3 多继承(重点) 10.4 虚基类 10.5 上机实训 本章教学目标: 了解类的继承中的基类、派生类、单继承、多继承及虚基类的相关概念 熟悉在继承方式下所体现的面向对象程序设计的编程思想 掌握三种不同继承方式下子类对父类的访问控制规则以及在父类基础上派生新类的方法,10.1 类继承概述,继承是类之间定义的一种重要关系,可以使一个类继承另一个类的所有操作和属性,从而实现程序的复用。本节主要介绍基类和派生类的概念、定义格式与使用方法。 10.

2、1.1 基类与派生类的概念 定义类B时,自动得到类A的操作和数据属性,使得程序员只需要定义类A中所没有的新成分就可完成类B的定义,这样称类B继承了类A,类A派生了类B。这种机制称为继承。已存在的用来派生新类的类称为基类,又称为父类。由已存在的类派生出的新类称为派生类,又称为子类。派生类可以具有基类的特性,共享基类的成员函数,使用基类的数据成员,还可以定义自己的新特性,定义自己的数据成员和成员函数。 从一个基类派生的继承称为单继承;从多个基类派生的继承称为多继承。图10-1反映了类之间继承和派生关系。,第10章 类继承的程序设计,10.1 类继承概述,10.1.2 派生类的定义格式 在C+中,派

3、生类的一般定义格式为: class 派生类名: 继承方式 基类名1,继承方式 基类名n 派生类成员定义; ; 说明: “派生类名”就是要定义的新类名,由用户自己命名。 “基类名”是程序中已存在的类名。 “继承方式”规定了子类对父类的访问权限,用关键字private、protected或public来表示,分别表示私有继承、保护继承和公有继承。,第5章 数组与指针,第10章 类继承的程序设计,【例10-1】圆Circle类继承点Point类。,#include class Point / 定义基类 private: float X,Y; public: Point(float a=0,float

4、 b=0) X=a; Y=b; void SetP(float a=0,float b=0) X=a; Y=b; void Display() cout“位置是:(“X“,“Y“)n“; ; class Circle:public Point / 公有继承Point类 private: float R; / 新增数据成员,程序运行结果为: 圆的位置是:(0,0) 圆的半径是:4.5 圆的位置是:(10,4) 圆的半径是:6,第5章 数组与指针,第10章 类继承的程序设计,public: Circle(float z=1,float x=0,float y=0):Point(x,y) R=z;

5、void SetC(float z=1,float x=0,float y=0)R=z; SetP(x,y); void Print() cout“圆的“;Display();cout“圆的半径是:“Rendl; ; / 把Setp()改进为SetC(),把 Display()改进为Print() void main() Circle a(4.5); a.Print(); a.SetC(6,10,4); a.Print(); ,关于继承的几点说明: (1)如果子类继承了父类,则子类自动具有父类的全部 数据成员(数据结构)和成员函数(功能);但是,子类对父类的成员的访问有所限制:父类的私有成员只

6、能被父类自己的成员函数、友元访问,任何子类均不能直接访问。子类对父类的公有成员的访问权限取决于继承时的“继承方式”的设定。 (2)子类可以定义自己的成员:数据成员和成员函数。 (3)基类、派生类,父类、子类都是“相对”的。,第5章 数组与指针,第10章 类继承的程序设计,10.1 类继承概述,10.1.3 继承的三种方式 类的继承方式有public(公有继承)、protected(保护继承)和private(私有继承)三种,不同的继承方式,导致原来具有不同访问属性的基类成员在派生类中的访问属性也有所不同。不同继承方式的结果如表10-1所示。,第5章 数组与指针,第10章 类继承的程序设计,10

7、.1 类继承概述,1公有继承 派生时用public作继承方式: (1)基类公有成员相当于派生类的公有成员,派生类成员可以像访问自身公有成员一样访问从基类继承的公有成员。 (2)基类保护成员相当于派生类的保护成员,派生类成员可以像访问自身保护成员一样访问从基类继承的保护成员。 (3)对于基类的私有成员,派生类内部成员无法直接访问,在派生类外部也无法通过派生类对象直接访问。,第5章 数组与指针,第10章 类继承的程序设计,10.1 类继承概述,2保护继承 派生时用protected作继承方式: (1)基类的公有成员和保护成员都相当于派生类的保护成员,派生类可以通过自身的成员函数或基类的成员函数访问

8、它们。 (2)对于基类的私有成员,派生类内部成员或派生类的对象都无法直接访问。,第5章 数组与指针,第10章 类继承的程序设计,10.1 类继承概述,3私有继承 派生时用private作继承方式: (1)基类公有成员和保护成员都相当于派生类的私有成员,派生类只能通过基类的公有成员函数访问它们。 (2)对于基类的私有成员,无论派生类内部成员或派生类的对象都无法直接访问。即派生类不能继承基类的private成员。,第5章 数组与指针,第10章 类继承的程序设计,10.1 类继承概述,10.2 单继承,10.2.1 单继承的定义 单继承的定义格式为: class 派生类名 :继承方式 基类名 pub

9、lic:成员定义; / 派生类新定义成员 private:成员定义; protected:成员定义; ;,第5章 数组与指针,第10章 类继承的程序设计,10.2 单继承,【例10-2】Point类的公有继承示例。 首先是程序的头文件 “Rectangle.h”部分。 class Point / 基类Point public: / 公有成员 void InitP(float xx=0,float yy=0) X=xx;Y=yy; void Move(float xOff,float yOff) X+=xOff;Y+=yOff; float GetX() return X; float GetY

10、() return Y; private: / 私有成员 float X,Y; ;,第5章 数组与指针,第10章 类继承的程序设计,10.2 单继承,class Rectangle:public Point / 派生类Rectangle公有继承基类Ponint public: / 新增公有成员函数 void InitR(float x,float y,float w,float h) InitP(x,y);W=w;H=h; / 调用基类公有成员函数 float GetW() return W; float GetH() return H; private: / 新增数据成员 float W,H

11、; ;,第5章 数组与指针,第10章 类继承的程序设计,10.2 单继承,主程序部分如下: #include #include #include“Rectangle.h“ void main() Rectangle rect; / 定义Rectangle类的对象 rect.InitR(5,2,10,60); / 设置矩形的参数 rect.Move(2,7); / 移动矩形位置 cout“The data of rect(X,Y,W,H): “endl; coutrect.GetX()“,“rect.GetY()“,“ rect.GetW()“,“rect.GetH()endl; / 输出矩形参

12、数 ,第5章 数组与指针,第10章 类继承的程序设计,程序运行结果为: The data of rect(X,Y,W,H): 7,9,10,60,【例10-3】Point类的私有继承示例。 class Point / 基类Point public: void InitP(float x=0,float y=0) X=x;Y=y; void Move(float x,float y) X+=x;Y+=y; float GetX() return X; float GetY() return Y; private: float X,Y; ;,第5章 数组与指针,第10章 类继承的程序设计,10.2

13、 单继承,class Rectangle:private Point / 派生类Rectangle私有继承Ponint public: / 新增成员函数 void InitR(float x,float y,float w,float h) InitP(x,y);W=w;H=h; / 派生类访问基类公有成员 void Move(float x,float y) Point:Move(x,y); float GetX() return Point:GetX(); float GetY() return Point:GetY(); float GetW() return W; float GetH

14、() return H; private: / 新增私有数据成员 float W,H; ; /end of Rectangle.h,第5章 数组与指针,第10章 类继承的程序设计,10.2 单继承,主程序部分如下: #include #include #include“Rectangle.h“ void main() Rectangle rect; / 定义Rectangle类的对象 rect.InitR(5,2,10,60); / 设置矩形参数 rect.Move(2,7); / 移动矩形位置 cout“The data of rect(X,Y,W,H): “endl; coutrect.G

15、etX()“,“rect.GetY()“,“; coutrect.GetW()“,“rect.GetH()endl; / 输出矩形参数 ,第5章 数组与指针,第10章 类继承的程序设计,程序运行结果为: The data of rect(X,Y,W,H): 7,9,10,60,10.2 单继承,10.2 单继承,10.2.2 单继承的使用 1构造函数 构造函数不能够被继承。C+提供了一种机制,使得在创建派生类对象时,能够调用基类的构造函数来初始化基类数据。 派生类构造函数的一般格式如下: 派生类名 (派生类构造函数总参数表):基类构造函数(参数表1), 子对象名(参数表2) 派生类中数据成员初始化; ;,第5章 数组与指针,第10章 类继承的程序设计,10.2 单继承,派生类的构造函数必须通过调用基类的构造函数来初始化基类子对象。 派生类构造函数的调用顺序为: (1)调用基类的构造函数,调用顺序按照它们继承时定义的顺序。 (2)调用子对象类的构造函数,调用顺序按照它们在类中定义的顺序。 (3)派生类构造函数体中的内容。,10.2 单继承,2析构函数 由于析构函数也不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数时的顺序正好相反。

展开阅读全文
相关资源
相关搜索

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

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