C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承

上传人:E**** 文档编号:89423402 上传时间:2019-05-25 格式:PPT 页数:29 大小:478.50KB
返回 下载 相关 举报
C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承_第1页
第1页 / 共29页
C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承_第2页
第2页 / 共29页
C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承_第3页
第3页 / 共29页
C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承_第4页
第4页 / 共29页
C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承》由会员分享,可在线阅读,更多相关《C++程序设计 教学课件 ppt 作者 任化敏 chapter11-类的派生与继承(29页珍藏版)》请在金锄头文库上搜索。

1、C+程序设计 第二部分:面向对象编程,第十一章 类的派生与继承,第十一章 类的派生与继承,概述 类的继承与派生 继承方式与访问控制 基类与派生类的构造函数和析构函数 基类与派生类的关系 多继承 虚基类,11.1 概述,类的继承(Inheritance)机制 通过继承,一个新类将在原有的、已定义类的基础上派生出来,它继承原有类的属性和行为,可以扩充新的属性和行为,也可以对原有类中的成员进行更新 由于新类是在原有类基础上产生的,定义新类时可以利用原有类的代码,从而降低软件开发成本,实现软件的重用,图11-1 类的继承关系图,11.2 类的继承与派生,继承 就是在一个已存在的类的基础上建立一个新的类

2、,已存在的类称作“基类”,或者“父类”,新建立的类称作“派生类”或者“子类”。 派生类继承了基类的所有数据成员和成员函数,并可以对成员做必要的增加或调整,单继承 多继承,11.2.1 定义基类,基类 任何用作定义其他类的基础的类 例如,我们直接根据类A定义类B,类A就称作是类B的直接基类。如果根据类B再定义类C的话,类B就是类C的直接基类,类A称作类C的间接基类。,基类Student定义示例,class Student public: /公有数据成员 string stuId; /学生编号 string name; /名字 int age; /年龄 private: /私有数据成员 vecto

3、r courses; /课程 public: /公有成员函数 Student(string stuId,string name,int age); /构造函数 Student(void); /析构函数 void setCourses(vector courses); /选课 vector getCourses(); /读取选课列表 void setName(string name)this-name=name; /设置学生的姓名 string getName()return name; /返回学生姓名 void setId(string stuId)this-stuId=stuId; /设置学

4、生学号 string getId()return stuId; /返回学生学号 void setAge(int age)this-age=age; /设置学生年龄 int getAge()return age; /返回学生年龄 ;,11.2.2 定义派生类,声明派生类的一般形式,派生类继承基类成员的数据成员,不继承基类的构造函数、析构函数以及任何重载赋值运算符的成员函数,class 派生类名:继承方式 基类名 派生类自己的成员 ;,派生类的主要工作 接收并修改基类的成员 增加新的成员 派生类的成员继承关系,建议:不要随意地从已有类中找一个类作为基类去构造派生类,应当考虑怎么样能够使派生类具有更

5、合理的结构。,11.3 继承方式与访问控制,公有派生:访问控制为public 私有派生:访问控制为private 保护派生:访问控制为protected 派生时指定不同的访问权限,直接影响到基类中的成员在派生类中的访问权限,11.3.1 公有派生,基类的公有成员 在派生类中仍为公有成员 基类的私有成员 在派生类中仍为私有成员 派生类不能直接使用基类中的私有成员,只能通过该基类公有的或保护的成员函数间接使用基类中的私有成员 基类的保护成员 在派生类中仍为保护成员 在派生类中可直接使用它们,但在派生类外,不可直接访问这些成员,必须通过派生类的公有成员函数或基类的公有成员函数才能访问,11.3.2

6、私有派生,基类的公有成员 在派生类中为私有成员 派生类中仍可直接访问这些成员,在派生类之外必须通过派生类中的公有成员函数来间接访问。 基类的私有成员 在派生类中仍为私有成员 派生类中不能直接访问基类中的私有成员,只能通过该基类公有的或保护的成员函数间接使用基类中的私有成员 基类的保护成员 在派生类中仍为保护成员,11.3.3保护派生,基类的公有成员和保护成员在派生类中都成为保护成员,基类的私有成员不能被派生类直接访问,这意味着派生类如果需要访问基类的私有成员,必须通过基类的公有成员访问该私有成员。,表11-1 共有和私有派生的访问权限,11.4 基类与派生类的构造函数和析构函数,11.4.1

7、派生类的构造函数,简单的派生类构造函数,派生类类名:派生类类名(参数):基类1(参数),基类n(参数) /派生类新增成员的初始化 ,说明:当说明派生类对象时,系统先调用各基类的构造函数,然后执行派生类的构造函数。若某个基类仍是派生类,则这种调用基类构造函数的过程递归进行下去。当撤销派生类的对象时,析构函数的调用顺序正好与构造函数的顺序相反。,默认构造函数 派生类也是类,如果没有定义构造函数,则根据类机制,会执行默认的无参数构造函数 构造顺序 派生类的默认无参数构造函数会首先调用基类的无参数构造函数,如果基类定义了有参数的构造函数且在派生类中没有重载定义无参数的构造函数,编译器会无法编译。如果基

8、类还有基类的话,基类会首先调用其基类的无参数构造函数,依次顺序地递归调用构造函数。,自定义构造函数 什么时候需要定义派生类的构造函数? 如果基类定义了带有形参表的构造函数时,派生类就应当定义构造函数,在构造函数中提供一个将参数传递给基类构造函数的途径,保证在基类进行初始化时能够获得必要的数据 如果基类没有定义构造函数,派生类也可以不定义构造函数,全部采用默认的构造函数,这时新增成员的初始化工作可以用其他公有成员函数来完成,单继承与多继承的构造函数调用次序 单继承 在类的层次结构中,除最顶层的基类外,其他派生类有且仅有一个父类,形成一棵倒挂的继承树 单继承时,派生类构造函数的调用次序 调用基类构

9、造函数 调用内嵌成员对象的构造函数,调用顺序按照它们在类中定义的顺序 调用派生类自己的构造函数,11.4.2 派生类的析构函数,派生类不能继承基类的析构函数,需要通过派生类的析构函数去调用基类的析构函数 派生类对象析构时的调用顺序 调用派生类析构函数(清理派生类新增成员) 调用派生类成员对象析构函数(清理派生类新增的成员对象) 调用基类析构函数(清理从基类继承来的基类子对象),11.5 基类与派生类的关系,11.5.1 基类与派生类定义的成员的优先关系,派生类定义的成员优先于基类中的同名成员,11.5.2 类型兼容,类型兼容 指在公有派生的前提下,一个派生类对象可以做为基类的对象来使用 类型兼

10、容有时也被称作赋值兼容或类型适应 可以将一个派生类对象赋值给一个基类对象 如果将基类对象赋值给派生类对象,任何试图通过基类指针去引用那些只有在派生类中才有的成员,都会出错,11.6 多继承,11.6.1 多继承的定义,多继承 定义:指派生类具有两个或两个以上 的直接基类 用多个基类派生一个类的一般格式,class 类名: 类名1, 类名n /派生类中新增成员,可为空 ;,提示:多继承中一定要注意两点:一是派生类成员与基类成员名字相同时,派生类对象访问具有该名字的成员时,如果不使用类作用域,默认状态访问的是派生类中定义的成员;二是多继承中派生类会继承自多个不同的基类,不同的继承方式决定了派生类对

11、基类成员不同的访问权限。,11.6.2 多继承的构造与析构函数,多继承派生类构造函数的调用次序 调用各基类的构造函数 调用内嵌成员对象的构造函数 调用派生类的构造函数 析构函数的调用 对派生类新增的普通成员进行清理 对派生类新增的对象成员进行清理 对所有继承自基类的成员进行清理,11.6.3 多继承的歧义性与解决方法,歧义情况一,定义派生类C的一个对象c1: C c1; 如果访问c1的fun函数的话,那么这个函数到底是类C的成员函数,还是类B的成员函数?,class A public: void print(); ; class B public: void print(); void fun

12、(); ; class C:public A,public B public: void fun(); ;,通过使用类作用域运算符“:”来对类名成员加以限定,11.6.3 多继承的歧义性与解决方法,歧义情况二,定义派生类D的对象d D d; d.a;/歧义,错误 d.A:a;/歧义,错误 两个语句都无法确定访问的是哪个类的成员,存在歧义,class A public: int a; ; class B:public A public: int b; ; class C:public A public: int c; ; class D:public B,public C ,d.B:a;/正确

13、d.C:a;/正确,11.6.3 多继承的歧义性与解决方法,歧义情况三,如果派生类中包含与基类相同名字的成员,派生类对象访问该名字的成员时,按照优先规则,必然会访问派生类中的成员,这一点本来是没有任何歧义的,只是在编程的过程中,从程序员的角度看,经常会对这种情况下访问哪个类感到困惑,采用类作用域“:”来解决这个问题,11.7 虚基类,虚基类 在多继承中,若希望公共基类在派生类中只有一个拷贝,可将该基类说明为虚基类 格式,class 派生类类名:virtual 虚基类类名 ,class 派生类类名: virtual 虚基类类名 ,进一步解释 如果派生类继承了多个基类,基类中既包含虚基类,又包含非虚基类,在创建派生类的对象时,会先调用虚基类的构造函数,然后再调用非虚基类的构造函数,最后才调用派生类的构造函数 如果派生类继承了多个虚基类,虚基类的构造函数的调用顺序取决于声明派生类时的基类顺序,

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

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

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