派生类与继承课件.pptx

上传人(卖家):ziliao2023 文档编号:5887914 上传时间:2023-05-14 格式:PPTX 页数:110 大小:735.31KB
下载 相关 举报
派生类与继承课件.pptx_第1页
第1页 / 共110页
派生类与继承课件.pptx_第2页
第2页 / 共110页
派生类与继承课件.pptx_第3页
第3页 / 共110页
派生类与继承课件.pptx_第4页
第4页 / 共110页
派生类与继承课件.pptx_第5页
第5页 / 共110页
点击查看更多>>
资源描述

1、 has-A(包含关系),用以描述一个类由多个(包含关系),用以描述一个类由多个“部件类部件类”构成。实现构成。实现has-A关系用类成员表示,关系用类成员表示,即一个类中的数据成员是已定义的类。即一个类中的数据成员是已定义的类。uses-A(一个类部分地使用另一个类),通过(一个类部分地使用另一个类),通过类之间成员函数的相互联系,定义友员或对象参数类之间成员函数的相互联系,定义友员或对象参数传递实现。传递实现。is-A(继承)。关系具有传递性(继承)。关系具有传递性,不具有对称性。不具有对称性。第1页/共110页非对称性非对称性:不是所有植物都属于蕨类。:不是所有植物都属于蕨类。传递性:传

2、递性:高等植物、蕨类植物、芒萁都是植物,高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征。具有植物的共同特征。植物 低等植物高等植物藻类菌类地衣类苔藓类蕨类裸子类被子类地钱小金发草毛蕨芒萁杉木柏木荔枝橘子第2页/共110页 继承继承 是类之间定义的一种重要关系。是类之间定义的一种重要关系。一个一个 B 类继承类继承A类,或称从类类,或称从类 A 派生类派生类 B 类类 A 称为基类(父类),类称为基类(父类),类 B 称为派生类(子类)称为派生类(子类)B1,B2 的基类A 的派生类C1,C2,C3 的基类A 的派生类(单继承)C3的基类B1,B2 的派生类(多继承)AB1B2C1C2C3

3、B1 的派生类第3页/共110页class person protected:char name10;int age;char sex;public:void print();class employee protected:char name10;int age;char sex;char department20;float salary;public:void print();第4页/共110页继承继承:保持已有类的特性而构造新类的过程。保持已有类的特性而构造新类的过程。派生:派生:在已有类的基础上新增自己的特性而产生在已有类的基础上新增自己的特性而产生新类的过程。新类的过程。继承的目的

4、:继承的目的:实现代码重用。实现代码重用。派生的目的:派生的目的:当新的问题出现,原有程序无法解当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行决(或不能完全解决)时,需要对原有程序进行改造。改造。第5页/共110页继承关系的语法形式继承关系的语法形式class 派生类名派生类名:基类名表基类名表 数据成员和成员函数声明数据成员和成员函数声明;派生类的功能:派生类的功能:可以增加新的数据成员;可以增加新的数据成员;可以增加新的成员函数;可以增加新的成员函数;可以重新定义基类中已有的成员函数;可以重新定义基类中已有的成员函数;可以改变现有成员的属性。可以改变现有成员的属性

5、。第6页/共110页基类名表基类名表 构成构成访问控制访问控制 基类名基类名1,访问控制访问控制 基类名基类名2,访问控制访问控制 基类名基类名n访问控制:访问控制:表示派生类对基类的继承方式表示派生类对基类的继承方式 公有继承公有继承 私有继承私有继承 保护继承保护继承第7页/共110页派生类对基类成员的使用,与继承访问控制和基派生类对基类成员的使用,与继承访问控制和基类中成员性质有关;类中成员性质有关;公有继承公有继承 基类的公有成员基类的公有成员派生类的公有成员派生类的公有成员基类的保护成员基类的保护成员派生类的保护成员派生类的保护成员私有继承私有继承 基类的公有成员和保护成员基类的公有

6、成员和保护成员 派生类的私有成员派生类的私有成员保护继承保护继承 基类的公有成员和保护成员基类的公有成员和保护成员 派生类的保护成员派生类的保护成员不论什么方式继承基类,派生类都不能直接使用不论什么方式继承基类,派生类都不能直接使用基类的私有成员。基类的私有成员。第8页/共110页(1 1)公有继承public 成员 public 成员protected 成员 protected 成员private 成员public 成员protected 成员private 成员基类派生类第9页/共110页#includeclass A public:void get_XY()cout x y;void p

7、ut_XY()cout x=x ,y=y n;protected:int x,y;class B:public A public:int get_S()return s;void make_S()s=x*y;/使用基类数据成员 x,y protected:int s;class C:public B public:void get_H()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 protected:int h,v;class Aclass C:public Bclass B:public A公有

8、继承的测试 第10页/共110页#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;class B:public A public:int get_S()return s;void make_S()s=x*y;/使用基类数据成员 x,y ;class C:public Bpublic:void get_H()cout h;int get_V()return v;void make_V()make_S();v=get_S()*h;/使用基类成员函数 ;class Aclass C:public Ycl

9、ass B:public X保护数据成员在类层次中可见公有继承的测试 第11页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;公有继承的测试 第12页

10、/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAx y 公有继承的测试 第13页/共110页void main()A

11、objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAx y objB.sobjB.yobjB.xobjBs公有继承的测试 第14页/共110页void main

12、()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBx y sobjC.hobjC.vobjC.sobjC.

13、yobjC.xobjCh v 公有继承的测试 第15页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sob

14、jB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC对 objA 的数据成员操作x y sh v 公有继承的测试 第16页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.m

15、ake_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对 objB 的数据成员操作x y sh v 公有继承的测试 第17页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.ge

16、t_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用派生类B成员函数对 objB 的数据成员操作x y sh v 公有继承的测试 第18页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY(

17、);cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC调用基类A成员函数对 objC 的数据成员操作x y sh v 公有继承的测试 第19页/共110页void main()A ob

18、jA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.yobjA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjC

19、调用派生类C成员函数对 objC 的数据成员操作x y sh v 公有继承的测试 第20页/共110页void main()A objA;B objB;C objC;cout It is object_A:n;objA.get_XY();objA.put_XY();cout It is object_B:n;objB.get_XY();objB.make_S();cout S=objB.get_S()endl;cout It is object_C:n;objC.get_XY();objC.get_H();objC.make_V();cout V=objC.get_V()endl;objA.y

20、objA.xobjAobjB.sobjB.yobjB.xobjBobjC.hobjC.vobjC.sobjC.yobjC.xobjCx y sh v 公有继承的测试 第21页/共110页public 成员protected 成员private 成员public 成员protected 成员private 成员基类派生类private 成员private 成员(2 2)私有继承第22页/共110页#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:p

21、rivate A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;私有继承的测试 class B:private Aclass A objB.sobjB.yobjB.xobjBprivate成员第23页/共110页#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=

22、y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A 调用基类成员函数objB.sobjB.yobjB.xobjBprivate成员私有继承的测试 第24页/共110页#includeclass A public:void get

23、_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A 访问私有数据成员objB.sobjB.yobjB.xobjBprivate成员私有继承的测试 第2

24、5页/共110页#includeclass A public:void get_XY()cout x y;void put_XY()cout x=x ,y=y n;protected:int x,y;class B:private A public:int get_S()return s;void make_S()get_XY();s=x*y;private:int s;void main()B objB;cout It is object_B:n;objB.make_S();cout S=objB.get_S()endl;class B:private Aclass A objB.sobjB

25、.yobjB.xobjBprivate成员私有继承的测试 第26页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;B b;b.addX();b.addY();cout a.x=a.out()endl;cout b.x=b.A:out()endl;cout b.y=b.out()endl;class

26、B:public Aclass A 基类的私有数据成员基类的私有数据成员不能在派生类中直接访问不能在派生类中直接访问但派生类对象建立私有数据空间但派生类对象建立私有数据空间 b.xa.xb.y私有继承的测试 第27页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()en

27、dl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A b.xa.xb.y私有继承的测试 第28页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.o

28、ut()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用构造函数调用构造函数对数据成员赋值对数据成员赋值1b.xa.xb.y私有继承的测试 第29页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:

29、int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 创建派生类对象调用基类 派生类构造函数b.x=1 b.y=111b.xa.xb.y私有继承的测试 第30页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:public A public:B()y=1;in

30、t out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用基类公有成员函数b.x+11b.xa.xb.y私有继承的测试 第31页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;private:int x;class B:pub

31、lic A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用派生类公有成员函数b.y+12b.xa.xb.y私有继承的测试 第32页/共110页#includeclass A public:A()x=1;int out()return x;void addX()x+;pr

32、ivate:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用基类版本同名函数返回 b.x 的值12b.xa.xb.y私有继承的测试 第33页/共110页#includeclass A public:A()x=1;int out

33、()return x;void addX()x+;private:int x;class B:public A public:B()y=1;int out()return y;void addY()y+;private:int y;void main()A a;cout a.x=a.out()endl;B b;b.addX();b.addY();cout b.x=b.A:out()endl;cout b.y=b.out()endl;class B:public Aclass A 调用派生类版本同名函数返回 b.y 的值12b.xa.xb.y私有继承的测试 第34页/共110页public 成员

34、protected 成员private 成员public 成员protected 成员private 成员基类派生类protected 成员protected 成员(3 3)保护继承第35页/共110页基类的构造函数和析构函数都不被继承,需基类的构造函数和析构函数都不被继承,需要在派生类中重新定义。由于派生类继承了要在派生类中重新定义。由于派生类继承了基类的成员,在初始化时,要同时初始化基基类的成员,在初始化时,要同时初始化基类成员。类成员。声明派生类构造函数时,除了需要对本类中声明派生类构造函数时,除了需要对本类中新增成员进行初始化外,还要对基类成员初新增成员进行初始化外,还要对基类成员初始

35、化。始化。第36页/共110页派生类构造函数声明的一般语法形式如下:派生类构造函数声明的一般语法形式如下::(参数总表参数总表):):基类名基类名1(1(参数表参数表1)1),.,基类名,基类名n(n(参数表参数表n)n),内嵌对象名内嵌对象名1(1(内嵌对象参数表内嵌对象参数表1)1),.,内嵌对象名内嵌对象名m(m(内嵌对象参数表内嵌对象参数表m)m)派生类新增成员的初始化语句;派生类新增成员的初始化语句;第37页/共110页其中:其中:派生类的构造函数名与派生类名相同。派生类的构造函数名与派生类名相同。参数总表需要列出初始化基类数据、新增内嵌对参数总表需要列出初始化基类数据、新增内嵌对象

36、数据及新增一般成员数据所需要的全部参数。象数据及新增一般成员数据所需要的全部参数。冒号之后,列出需要使用参数进行初始化的基类冒号之后,列出需要使用参数进行初始化的基类名和内嵌成员名及各自的参数表,各项之间用逗名和内嵌成员名及各自的参数表,各项之间用逗号分隔。号分隔。第38页/共110页派生类构造函数的执行顺序:派生类构造函数的执行顺序:(1)先调用基类的构造函数;)先调用基类的构造函数;(2)然后按照数据成员的声明顺序,依次调用数)然后按照数据成员的声明顺序,依次调用数据成员的构造函数;据成员的构造函数;(3)最后执行派生类构造函数的函数体。)最后执行派生类构造函数的函数体。注意:注意:构造函

37、数的执行顺序只与成员声明的顺序有构造函数的执行顺序只与成员声明的顺序有关,而与初始化表中各项的排列顺序无关。关,而与初始化表中各项的排列顺序无关。常量常量成员、引用成员、内嵌对象,只能通过初始化表的方成员、引用成员、内嵌对象,只能通过初始化表的方法初始化。法初始化。基类基类 对象成员对象成员 派生类派生类第39页/共110页 析构函数也不被继承,派生类自行声明。声明析构函数也不被继承,派生类自行声明。声明方法与一般(无继承关系时)类的析构函数相同。方法与一般(无继承关系时)类的析构函数相同。派生类析构函数执行时将自动调用基类及内嵌对派生类析构函数执行时将自动调用基类及内嵌对象的析构函数,系统会

38、自动隐式调用,因此不必象的析构函数,系统会自动隐式调用,因此不必显式调用。显式调用。析构函数的调用次序与构造函数相反。析构函数的调用次序与构造函数相反。第40页/共110页/构造函数调用顺序测试,构造函数无参数#include class Base public:Base()cout Base created.n;class D_class:public Base public:D_class()cout D_class created.n;void main()D_class d1;调用基类构造函数第41页/共110页/构造函数调用顺序测试,构造函数无参数#include class Bas

39、e public:Base()cout Base created.n;class D_class:public Base public:D_class()cout D_class created.n;void main()D_class d1;调用派生类构造函数第42页/共110页#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()

40、cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display()

41、;data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();带参数构造函数调用顺序测试第43页/共110页#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=dat

42、a1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display

43、();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();int data1,data2;int data3;parent_class data4;data1data2 data4data1data2data3parent_classderived_classdata1data2带参数构造函数调用顺序测试第44页/共110页带参数构造函数调用顺序测试#include class parent_class int data1,data2;public:parent_class

44、(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;i

45、nt inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()ret

46、urn +data1;int inc2()return +data2;void display()coutdata1=data1,data2=data2endl;基类有一个带参数的构造函数 data4data1data2data3parent_classderived_classdata1data2第45页/共110页带参数构造函数调用顺序测试#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc

47、2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void

48、 display()parent_class:display();data4.display();cout data3=data3 endl;void main()derived_class d1(17,18,1,2,-5);d1.inc1();d1.display();class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display()coutdata1=data1

49、,data2=data2endl;成员函数数据成员自增 data4data1data2data3parent_classderived_classdata1data2第46页/共110页#include class parent_class int data1,data2;public:parent_class(int p1,int p2)data1=p1;data2=p2;int inc1()return +data1;int inc2()return +data2;void display ()cout data1=data1 ,data2=data2 endl;class derived

50、_class:private parent_class int data3;parent_class data4;public:derived_class(int p1,int p2,int p3,int p4,int p5):parent_class(p1,p2),data4(p3,p4)data3=p5;int inc1()return parent_class:inc1();int inc3()return +data3;void display()parent_class:display();data4.display();cout data3=data3 endl;void main

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(派生类与继承课件.pptx)为本站会员(ziliao2023)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|