C++中的继承与派生ppt课件.ppt
《C++中的继承与派生ppt课件.ppt》由会员分享,可在线阅读,更多相关《C++中的继承与派生ppt课件.ppt(107页珍藏版)》请在三一办公上搜索。
1、,C+程序设计,第4讲 继承与派生 参见教材第8章,本章重点:理解继承对于处理复杂性和实现代码重用的意义。继承和派生的概念 -从已有的类派生出新的类。如何实现继承。,第4讲 继承与派生,4.1 继承与派生的概念继承性是面向对象程序设计中最重要的机制。这种机制提供了无限重复利用程序资源的一种途径。通过C+语言中的继承机制,可以扩充和完善旧的程序设计以适应新的需求。这样不仅可以节省程序开发的时间和资源,并且为未来程序增添了新的资源。,class Student int num; char name30; char sex; public: void display( ) /对成员函数display
2、的定义 coutnum: numendl; coutname: nameendl; coutsex: sexendl; ;,class Studend1 int num; /此行原来己有 char name20; /此行原来己有 char sex; /此行原来己有 int age; char addr20; public: void display( ) ; /此行原来己有 coutnum: numendl; /此行原来己有 coutname: nameendl;/此行原来己有 coutsex: sexendl; /此行原来己有 coutage: ageendl; coutaddress: a
3、ddrendl; ;,利用原来定义的类Student作为基础,再加上新的内容即可,以减少重复的工作量。 C+提供的继承机制就是为了解决这个问题。在C+中所谓“继承”就是在一个已存在的类的基础上建立一个新的类。已存在的类称为“基类(base class)”或“父类(father class)”。新建立的类称为“派生类(derived class)”或“子类(son class)”。,一个新类从已有的类那里获得其已有特性称为类的继承,从已有的类(父类)产生一个新的子类称为类的派生。 在C+语言中,一个派生类可以从一个基类派生,也可以从多个基类派生。从一个基类派生的继承称为单继承;从多个基类派生的继
4、承称为多继承。,人类: 姓名、性别、年龄、身高、体重教师类: 姓名、性别、年龄、身高、体重、专业、职称管理人员类: 姓名、性别、年龄、身高、体重、职务教师管理人员类: 姓名、性别、年龄、身高、体重、专业、职称、职务学生类: 姓名、性别、年龄、身高、体重、学号、班级、专业,多继承:派生类有多个基类,单继承:派生类只有一个基类,直接基类,间接基类,4.2 派生类的声明与实现class Student1: public Student/声明基类是Studentprivate: int age; /新增加的数据成员 string addr; /新增加的数据成员public: void display_
5、1( ) /新增加的成员函数 coutage: ageendl; coutaddress: addrendl; ;,从一个基类派生一个类的一般格式为:class ClassName:BaseClassName private: .; /私有成员说明 public: .; /公有成员说明 protected: .; /保护成员说明 ,派生类名,基类名,继承方式,派生类中新增加的成员,类A派生类B:类A为基类,类B为派生类。,A,B,但派生并不是简单的扩充,有可能改变基类的性质。,有三种派生方式:公有派生、保护派生、私有派生。,class B:public A.;,class B:protecte
6、d A.;,class B:private A.;,默认的是私有派生。,class B: A .;,A为私有派生,在建立派生类的过程中,基类不会做任何改变。派生类则除了继承基类的所有可引用的成员变量和成员函数外,还可另外定义本身的成员变量和处理这些变量的函数。由于派生类可继承基类的成员变量和成员函数,因此在基类中定义好的数据和函数等的程序代码可重复使用。,4.3 派生类的构成类A派生类B:类A为基类,类B为派生类。,从基类接收成员(不包括构造函数和析构函数),调整从基类接收的成员,声明派生类时增加的成员,当从已有的类中派生出新的类时,可以对派生类做以下几种变化:1、可以继承基类的成员数据或成员
7、函数。2、可以重新定义已有的成员函数。3、可以改变现有的成员访问属性。 4、可以增加新的成员变量。5、可以增加新的成员函数。,4.4 派生类成员的访问属性,类成员的访问权限:私有成员(private):可以被类自身的成员和友元访问,但不能被包括派生类在内的其他任何类和任何普通函数访问 公有成员(public):可以被任何普通函数和任何类的成员函数访问保护成员(protected):可以被类自身的成员和友元访问外,还可以被派生类的成员函数访问,但不能被任何非友元的普通函数访问 类的三种继承方式:公有继承(public):保护继承(protected):私有继承(private):,常使用如下三种
8、关键字给予表示:1. 公有继承(public) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限不变2. 私有继承(private) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限变为私有类型3. 保护继承(protected) 基类的私有成员不能被派生类的函数成员访问 基类的公有成员和保护成员在派生类中的访问权限变为保护类型,类的继承访问特性,4.4.1 公用继承class ClassName: public BaseClassName公有派生时,基类中所有成员在派生类中保持各个成员的访问权限。,公有派生,派生类中
9、保持基类的成员特性,A,B,public,x在类B新增加的成员中不能直接调用,y在类B中可以调用,z在整个文件中可以调用,例4.1 访问公有基类的成员,#include #include using namespace std;class Studentpublic: void get_value() cinnumnamesex; void display( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; private : int num; string name; char sex;,class Student1: pub
10、lic Student public: void get_value_1() cinageaddr; void display_1() /coutnum: numendl; /企图引用基类的私有成员,错误 /coutname: nameendl; /企图引用基类的私有成员,错误 /coutsex: sexendl; /企图引用基类的私有成员,错误 coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 s
11、tud1; stud1.get_value(); stud1.get_value_1(); stud1.display(); stud1.display_1(); return 0;,4.4.2 私有继承class ClassName: private BaseClassName私有派生时,基类中公有成员和保护成员在派生类中均变为私有的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。,私有派生,派生类中基类公有和保护成员成为私有,基类:public: (变为私有)在派生类中使用,类外不可使用protected: (变为私有)在派生类中使用,类外不可使用private
12、: 不能在派生类中和类外使用,A,B,private,x在类B新增加的成员中不能直接调用,y在类B中可以调用,z在类B中可以调用,均为私有类B 外不能引用,例4.2 私有继承,class Student1: private Student public: void display_1() coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 stud1; stud1.display(); stud1.d
13、isplay_1(); stud1.age18; return 0;,例4.2 私有继承,class Student1: private Student public: void display_1() display(); coutage: ageendl; /引用派生类的私有成员,正确 coutaddress: addrendl; /引用派生类的私有成员,正确 private: int age; string addr; ;,int main() Student1 stud1; stud1.display_1(); return 0;,4.4.3 保护继承class ClassName:
14、protected BaseClassName保护派生时,基类中公有成员和保护成员在派生类中均变为保护的,在派生类中仍可直接使用这些成员,基类中的私有成员,在派生类中不可直接使用。,保护派生,派生类中基类公有和保护成员降级使用,例4.3 在派生类中引用保护成员,#include #include using namespace std;class Student /声明基类public: /基类公用成员 void display( ); protected : /基类保护成员 int num; string name; char sex;void Student:display( ) cout
15、num: numendl; coutname: nameendl; coutsex: sexendl; ,class Student1: protected Student /用protected继承方式声明一个派生类public: void display1( ); private: int age; string addr;void Student1:display1( ) coutnum: numendl; /引用基类的保护成员,合法 coutname: nameendl; /引用基类的保护成员,合法 coutsex: sexendl; /引用基类的保护成员,合法 coutage: ag
16、eendl; /引用派生类的私有成员,合法 coutaddress: addrendl; /引用派生类的私有成员,合法,int main( ) Student1 stud1; /stud1是派生类student1的对象 stud1.display1( ); /display1是派生类中的公用成员函数 stud1.num=10023; return 0; ,4.4.4 多级派生时的访问属性直接派生类 间接派生类直接基类 间接基类,例4.4 多级派生的访问属性,class A /基类public: int i; protected: void f2(); int j; private: int k
17、;,class B: public A /public方式public: void f3( ); protected: void f4(); private: int m;,class C: protected B /protected方式public: void f5(); private: int n;,4.5 派生类的构造函数和析构函数,基类的构造函数和析构函数都不被继承,需要在派生类中重新定义。由于派生类继承了基类的成员,在初始化时,也要同时初始化基类成员。可通过调用基类的构造函数对基类成员完成初始化。派生类构造函数定义的一般格式为:派生类名:构造函数名(参数表):基类构造函数名(参数
18、表) 派生类中新增数据成员初始化语句,例4.5 简单的派生类的构造函数,#include #includeusing namespace std;class Student /声明基类 public: /公用部分 Student(int n,string nam,char s ) /基类构造函数 num=n; name=nam; sex=s; Student( ) /基类析构函数 protected: /保护部分 int num; string name; char sex ;,class Student1: public Student /声明公用派生类student public: Stu
19、dent1(int n,string nam,char s,int a, string ad) : Student(n,nam,s) /派生类构造函数 age=a; /在函数体中只对派生类新增的数据成员初始化 addr=ad; void show( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendlendl; Student1( ) /派生类析构函数 private: /派生类的私有部分 int age; string addr; ;,int main
20、( ) Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai); Student1 stud2(10011,Zhang-fun,m,21,213 Shanghai Road,Beijing); stud1.show( ); /输出第一个学生的数据 stud2.show( ); /输出第二个学生的数据 return 0;,将派生类构造函数在类外定义Student1(int n,string nam,char s,int a, string ad);,Student1:Student1(int n,string nam,char s
21、,int a, string ad) : Student(n,nam,s) age=a; addr=ad; ,类中函数声明不包括基类构造函数名及其参数列表,定义函数时才给出。,Student1(int n,string nam,char s,int a, string ad) : Student(10010,nam,s),Student1(int n,string nam,char s,int a, string ad) : Student(10010,nam,s),age(a),addr(ad),派生类构造函数的执行顺序: (1)先调用基类的构造函数 (2)最后执行派生类构造函数的函数体派生
22、类析构函数的执行顺序: (1)先执行派生类析构函数 (2)再执行基类析构函数,4.5.2 有子对象的派生类的构造函数,类的数据成员中还可以包含类对象Student s1;s1是类对象中的内嵌对象,称为子对象。,教材案例调试:P172 例8.7,例4.6 包含子对象的派生类的构造函数,#include #include using namespace std;class Student /声明基类 public: /公用部分 Student(int n,string nam) /基类构造函数 num=n; name=nam; void display() /输出基类数据成员 coutnum:nu
23、mendlname:nameendl; protected: /保护部分 int num; string name;,class Student1: public Student /用public继承方式声明派生类student public: Student1(int n,string nam,int n1,string nam1,int a,string ad) :Student(n,nam),monitor(n1,nam1) /派生类构造函数 age=a; /在此处只对派生类新增的数据成员初始化 addr=ad; void show( ) coutThis student is:endl
24、; display(); /输出num和name coutage: ageendl; coutaddress: addrendlendl; void show_monitor() /输出子对象的数据成员 coutendlClass monitor is:endl; monitor.display(); /调用基类成员函数 private: /派生类的私有数据 Student monitor; /定义子对象(班长) int age; string addr; ;,int main( ) Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijin
25、g Road,Shanghai); stud1.show( ); /输出第一个学生的数据 stud1.show_monitor(); /输出子对象的数据 return 0; ,派生类构造函数定义的一般格式为:派生类名:构造函数名(总参数表):基类构造函数名(参数表,子对象名(参数表列) 派生类中新增数据成员初始化语句,基类构造函数和子对象的次序可以是任意的,编译系统根据相同的参数名确定传递关系,派生类构造函数的调用顺序如下:基类的构造函数子对象类的构造函数派生类的构造函数,class B:public A int y; A a1;public: B(int a, int b):A(a),a1(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 中的 继承 派生 ppt 课件

链接地址:https://www.31ppt.com/p-2002326.html