《(C++程序设计课件)第四章 面向对象的程序设计.ppt》由会员分享,可在线阅读,更多相关《(C++程序设计课件)第四章 面向对象的程序设计.ppt(48页珍藏版)》请在金锄头文库上搜索。
1、1 1 C 与C 2 第四章面向对象的程序设计 3 classPoint public Point inta 0 intb 0 voidsetPoint inta intb intgetX const returnx intgetY const returny private intx y 4 classQuadRangle public QuadRangle Pointp1 Pointp2 Pointp3 Pointp4 QuadRangle PointgetPoint intindex const voidsetPoint constPoint 新增矩形类rectangle 具有四个顶点
2、能够整体移动 放大缩小 设置 取得左上 右下顶点 计算矩形面积 如何重用四边形类 4 1继承 5 继承性是面向对象的另一大特点 基于现有的类建立新类 新类继承了现有类的属性 成员变量 和行为 成员函数 并且添加自己新的属性和行为 现有类 基类 父类 新类 派生类 子类 4 1继承 6 继承是类之间定义的一种重要关系 定义类B时 自动得到类A的操作和数据属性 使得程序员只需定义类A中所没有的新成分就可完成在类B的定义 这样称类B继承了类A 类A派生了类B A是基类 父类 B是派生类 子类 这种机制称为继承 称已存在的用来派生新类的类为基类 又称父类 由已存在的类派生的新类称为派生类 又称为子类
3、自己的数据成员和成员函数 在C 语言中 一个派生类可以从一个基类派生 也可以从多个基类派生 从一个基类派生的继承称为单继承 从多个基类派生的继承称为多继承 7 classRectangle publicQuadRangle public Rectangle PointleftUp PointrightDown Rectangle intarea const voidsetLU PointleftUp voidsetRD PointrightDown PointgetLU const PointgetRD const private intarea include QuadRangle h 注意
4、 定义派生类时必须看到基类的定义 area 注意 派生类不能访问基类的私有成员函数和私有成员变量 可以访问公有成员 8 Rectangle Rectangle PointleftUp PointrigntDown Pointp1 rightDown getX leftUp getY Pointp2 leftUp getX rightDown getY setPoint leftUp 1 setPoint p1 2 setPoint righDown 3 setPoint p2 4 计算面积并保存到area Pointp1 0 5 p2 10 0 Rectanglert p1 p2 intare
5、a rt area rt zoom 10 rt move 0 10 调用基类的公有成员 9 classQuadRangle public protected Pointv1 v2 v3 v4 protected 派生类可以直接访问 Rectangle Rectangle PointleftUp PointrigntDown v1 leftUp v2 setPoint rightDown getX leftUp getY v3 righDown v4 setPoint leftUp getX rightDown getY 计算面积并保存到area 10 4 2继承方式 11 include Qu
6、adRangle h classRectangle privateQuadRangle public intarea const private intarea Pointp1 0 5 p2 10 0 Rectanglert p1 p2 intarea rt area rt zoom 10 rt move 0 10 12 classRectangle publicQuadRangle public Rectangle PointleftUp PointrightDown Rectangle classQuadRangle public QuadRangle Pointp1 Pointp2 Po
7、intp3 Pointp4 QuadRangle private Pointv1 v2 v3 v4 Pointp1 0 5 p2 10 0 Rectanglert p1 p2 如何构造派生类 13 4 3派生类的构造与析构 新建一个类A的对象时 构造函数的调用顺序总是如下 先看类A否有基类 若有则调用基类构造函数看类A是否有成员类对象 若有则调用成员类对象构造函数 如果有多个成员类对象 则构造函数的调用顺序是对象在类中被声明的顺序 类A构造函数 14 Pointp1 0 5 p2 10 0 Rectanglert p1 p2 classRectangle publicQuadRangle pu
8、blic Rectangle PointleftUp PointrightDown Rectangle classQuadRangle public QuadRangle Pointp1 Pointp2 Pointp3 Pointp4 QuadRangle private Pointv1 v2 v3 v4 classPoint public Point inta 0 intb 0 1 调用四次 1 1 15 注意 作为一般规则 派生类构造函数不应该直接向一个基类数据成员赋值 而是把值传递给适当的基类构造函数 否则两个类的实现变成紧耦合的 Rectangle Rectangle Pointlef
9、tUp PointrigntDown v1 leftUp v2 setPoint rightDown getX leftUp getY v3 righDown v4 setPoint leftUp getX rightDown getY 16 classPerson public Person constchar str NULL inta 0 protected char name intage classStudent publicPerson public Student constchar str NULL inta 0 inti 0 private intid Student Stu
10、dent constchar str inta inti Person str a id i 17 析构函数调用顺序与它的构造函数调用顺序相反 类A的对象生命期结束时 析构函数调用顺序为 类A析构函数 看类A是否有成员类对象 若有则调用成员类对象析构函数 看类A否有基类 若有则调用基类析构函数 18 classPerson public Person Person Person delete name classStudent publicPerson public Student Student Student delete name Student ptr newStudent lipin
11、g 18 2 deleteptr 2 删除两次name 基类构造函数分配的存储空间 一般由基类的析构函数释放 19 person hclassPerson student h include person h classStudent publicPerson include student h include person h voidmain PersonzhangSan ZhangSan 45 StudentzhangSi ZhangSi 18 10 类Person的重复定义 person h ifndefPERSON definePERSONclassPerson endif 20 c
12、lassPerson public 改变年龄voidchangeInfo inta classStudent publicPerson public 改变学号voidchangeInfo inti 改变年龄 学号voidchangeInfo inta inti Studentlisi lisi 18 10 lisi changeInfo 20 4 4重定义 21 重定义 派生类中的成员与基类中的成员同名时 不会产生重复定义错误 派生类中的成员定义将覆盖基类中的成员定义 重定义 对于成员函数 若函数名相同 参数不同 不会形成函数重载 classPerson public 改变年龄voidchan
13、geInfo inta protected intid 身份证号 classStudent publicPerson public 改变年龄 学号voidchangeInfo inta inti private intid 学号 Studentlisi lisi 18 10 lisi changeInfo 20 1 lisi changeInfo 1101850101 22 voidStudent changeInfo inta inti age a id i Student id 在Student的成员函数中直接访问Person中的id Person id 23 4 5类型兼容规则 clas
14、sParent classSon publicParent SonxiaoLi ParentlaoLi xiaoLi Parent ptr ParentlaoWang SonxiaoWang laoWang 24 类型兼容规则是指在需要基类对象的任何地方 都可以使用公有派生类的对象来替代 包括以下情况 派生类的对象可以赋值给基类对象 派生类的对象可以初始化基类的应用 派生类对象的地址可以赋给指向基类的指针 在替代之后 派生类对象就可以作为基类的对象使用 但只能使用从基类继承的成员 25 classParent classSon publicParent SonxiaoLi ParentlaoL
15、i ptr laoLi xiaoLi Parent ParentlaoWang SonxiaoWang laoWang 26 includeusingnamespacestd classB0 public voiddisplay coutdisplay intmain B0b0 B1b1 D1d1 fun fun d1 输出 B0 displayB0 displayB0 display 27 classPerson public 打印姓名 年龄voidprint protected char name intage classStudent publicPerson public 打印姓名 年
16、龄 学号voidprint private intid classEmployee publicPerson public 打印姓名 年龄 职务 薪水voidprint private char title doublesalary 打印个人信息的全局函数voidprint one one print 4 6多态 28 用基类的指针或引用操纵多个派生类的能力被称为多态 打印个人信息voidprint Person one one print Studentlisi lisi 18 1 Employeelisan lisan 30 Manager 2000 print 自动被转换成Person 29 在运行时刻需要解析出被调用的函数 这个解析过程被称为动态绑定 dynamicbindng 缺省情况下 函数是在编译时刻被静态解析的 在C 中通过一种被称为虚函数的机制来支持动态绑定 通过继承和动态绑定 使类的多态性得到体现 30 classPerson public 打印姓名 年龄virtualvoidprint classStudent publicPerson public 打印姓名 年