【精品】c++_继承和派生类(可编辑.ppt
《【精品】c++_继承和派生类(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】c++_继承和派生类(可编辑.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+_继承和派生类13.1 继承与派生的概念继承与派生的概念 在在C+中中,所所谓谓“继继承承”就就是是在在一一个个已已存存在在的的类类的的基础上建立一个新的类。基础上建立一个新的类。已已存存在在的的类类称称为为“基基类类”或或“父父类类”;新新建建立立的的类类称为称为“派生类派生类”或或“子类。子类。新新产产生生的的类类不不仅仅有有自自己己特特有有的的成成员员数数据据和和成成员员函函数数,而且而且有被继承类的全部成员数据和成员函数有被继承类的全部成员数据和成员函数。一一个个基基类类可可以以派派生生出出许许多多个个派派生生类类,每每一一个个派派生生类类又又可可以以作作为为基基类类再再派派生生出
2、出新新的的派派生生类类,因因此此基基类类和和派生类是相对而言的。派生类是相对而言的。一一代代一一代代地地派派生生下下去去,就就形形成成了了类类的的继继承承的的层层次次结结构。构。继承常用来表示继承常用来表示类属类属关系,不能将继承理解关系,不能将继承理解为构成关系。当从现存类中派生出新类时,为构成关系。当从现存类中派生出新类时,可以对派生类做如下几种变化:可以对派生类做如下几种变化:全部或部分地继承基类的成员数据或成员函数;全部或部分地继承基类的成员数据或成员函数;可以增加新的数据成员;可以增加新的数据成员;可以增加新的成员函数;可以增加新的成员函数;可以重新定义已有的成员函数;可以重新定义已
3、有的成员函数;可以改变现有成员的属性。可以改变现有成员的属性。基类基类派生类派生类1派生类派生类2(a a)单一继承)单一继承 一个基类一个基类可以直接可以直接派生出多派生出多个派生类个派生类 单一继承与多重继承单一继承与多重继承 一个派生类只有一个直接基类的情况称为单一继承一个派生类只有一个直接基类的情况称为单一继承(single-inheritance)。如果一个派生类可以同时有多个)。如果一个派生类可以同时有多个基类,称为多重继承(基类,称为多重继承(multiple-inheritance),这时的派),这时的派生类同时得到了多个已有类的特征。生类同时得到了多个已有类的特征。派生出来派
4、生出来的新类同样的新类同样可以作为基可以作为基类再继续派类再继续派生出更新的生出更新的类,依此类类,依此类推形成一个推形成一个层次结构层次结构。基类基类1基类基类2基类基类n派生类派生类1派生类派生类2(b)多重继承)多重继承 class Tri double x,y,z;/表示三角形三边表示三角形三边public:Tri(double,double,double);/构造函数构造函数 double Peri();/求三角形的周长求三角形的周长 double Area();/求三角形的面积求三角形的面积;class Col:public Tri /公有继承Tri类 double h;/表示三角
5、柱体的高度public:Col(double,double,double,double);double Volu();/求三角柱体的体积;在派生类的类体中,只需要声明新增的成员数据和在派生类的类体中,只需要声明新增的成员数据和成员函数即可。成员函数即可。多继承的派生类多继承的派生类定义格式如下:定义格式如下:class:继承方式继承方式1,继承方继承方式式2,继承方式继承方式n;继承方式的解释与单继承一致。继承方式的解释与单继承一致。class Stu int stu_id;/代表学生学号代表学生学号 double score;/代表学生成绩代表学生成绩public:Stu(int,doubl
6、e);/学生类的构造学生类的构造函数函数 void Show();/输出学生的信息输出学生的信息;class Emp int sta_id;/代表职工工号代表职工工号 double salary;/代表职工工资代表职工工资public:Emp(int,double);/职工类构造函数职工类构造函数 void Show();/输出职工的信息输出职工的信息;class Stu_Emp:public Stu,public Emppublic:Stu_Emp(int,double,int,double);/新类型的构造函数新类型的构造函数 void Show();/输出新类型的信息输出新类型的信息;1
7、3.1.3 派生类的三种继承方式派生类的三种继承方式 派生类中的成员由两部分组成,一部分是从基类派生类中的成员由两部分组成,一部分是从基类继承来的,一部分是派生类新增的。继承来的,一部分是派生类新增的。从基类继承来的成员在派生类中的访问权限与其从基类继承来的成员在派生类中的访问权限与其继承方式是密切相关的,并且除了继承方式是密切相关的,并且除了public,protected和和private之外,还有一种访问权限称之外,还有一种访问权限称为为“不可访问不可访问”,即无论何种继承方式,派生类,即无论何种继承方式,派生类中从基类继承过来的基类的私有成员在派生类中中从基类继承过来的基类的私有成员在
8、派生类中都是不可访问的。都是不可访问的。基类的私有成员在派生类中并没有成为派生类中基类的私有成员在派生类中并没有成为派生类中的私有成员,只有基类的成员函数可以引用它,的私有成员,只有基类的成员函数可以引用它,而不能被派生类的成员函数引用。而不能被派生类的成员函数引用。公有继承公有继承 当派生类以当派生类以公有公有(publicpublic)方式)方式继承继承基类时,基基类时,基类的类的公有成员和保护成员公有成员和保护成员在派生类中的在派生类中的访问权限访问权限不变不变,仍为公有成员和保护成员;而基类的,仍为公有成员和保护成员;而基类的私有私有成员成员则如前所述,则如前所述,在派生类中在派生类中
9、的访问权限成为的访问权限成为“不可访问不可访问”。class A int x;/私有私有protected:int y;/保护保护public:int z;/公有公有 A(int a,int b,int c)x=a;y=b;z=c;void ShowA()coutxtytzendl;class B:public A/公有继承公有继承 int t;/私有私有public:B(int a,int b,int c,int d):A(a,b,c)t=d;void ShowB()couttendl;void main()B ob(1,2,3,4);/定义派生类对象定义派生类对象 ob.ShowA();/
10、调用派生类中继承基类的公有成员函数调用派生类中继承基类的公有成员函数 ob.ShowB();/调用派生类中新定义的公有成员函数调用派生类中新定义的公有成员函数私有继承私有继承 当派生类以当派生类以私有私有(private)方式)方式继承继承基类时,基基类时,基类的类的公有成员和保护成员公有成员和保护成员在在派生类中派生类中的访问权限的访问权限全部成为私有成员全部成为私有成员;而基类的;而基类的私有成员私有成员在派生类在派生类中的访问权限仍为中的访问权限仍为“不可访问不可访问”。当定义派生类。当定义派生类时省略基类的继承方式时,时省略基类的继承方式时,默认默认的继承方式是私的继承方式是私有(有(
11、private)继承。)继承。class A int x;/私有私有protected:int y;/保护保护public:int z;/公有公有 A(int a,int b,int c)x=a;y=b;z=c;void ShowA()coutxtytzendl;class B:private A/私有继承私有继承 int t;/私有私有public:B(int a,int b,int c,int d):A(a,b,c)t=d;void ShowB()ShowA();couttendl;void main()B ob(1,2,3,4);/定义派生类对象定义派生类对象 /ob.ShowA();/
12、不能在类外调用基类成员不能在类外调用基类成员 ob.ShowB();/调用派生类中新定义的公有成员函数调用派生类中新定义的公有成员函数保护继承保护继承 当派生类以当派生类以保护(保护(protected)方式继承)方式继承基类时,基类时,基类的公有成员和保护成员基类的公有成员和保护成员在派生类中的访问权在派生类中的访问权限限全部成为保护成员全部成为保护成员;而基类的;而基类的私有成员私有成员在派生在派生类中的访问权限仍为类中的访问权限仍为“不可访问不可访问”。保护(保护(protected)继承是一种带有)继承是一种带有“血缘血缘”关系关系的继承形式,可以想象,基类无论经过多少次的继承形式,可
13、以想象,基类无论经过多少次“保护保护”继承,其公有成员和保护成员在派生类内继承,其公有成员和保护成员在派生类内部都是允许访问的,而在类外是禁止访问的。部都是允许访问的,而在类外是禁止访问的。class A int x;/私有私有protected:int y;/保护保护public:int z;/公有公有 A(int a,int b,int c)x=a;y=b;z=c;void ShowA()coutxtytzendl;class B:protected A/保护继承保护继承 int t;/私有私有public:B(int a,int b,int c,int d):A(a,b,c)t=d;vo
14、id ShowB()/公有函数公有函数 ShowA();/基类中的公有变为派生类中的保护,只能在类中调用基类中的公有变为派生类中的保护,只能在类中调用 couttendl;void main()B ob(1,2,3,4);/定义派生类对象定义派生类对象/ob.ShowA();/不能在类外调用基类成员不能在类外调用基类成员 ob.ShowB();/调用派生类中新定义的公有成员函数调用派生类中新定义的公有成员函数不同派生方式访问权限不同派生方式访问权限不可直接访问不可直接访问 不可直接访问不可直接访问 private 不可直接访问不可直接访问 private protected 不可直接访问不可直
15、接访问 private public u私有派私有派生生 不可直接访问不可直接访问 不可直接访问不可直接访问 private 不可直接访问不可直接访问 protected protected 可直接访问可直接访问 public public u公有派公有派生生 外部函数外部函数void main()在派生类中对在派生类中对基类成员的访基类成员的访问限定问限定 基类中的访基类中的访问限定问限定 派生方式派生方式 不可直接访问不可直接访问 不可直接访问不可直接访问 private 不可直接访问不可直接访问 protected protected 不可直接访问不可直接访问 protected pub
16、lic u保护派保护派生生 13.2.1 单继承派生类的构造函数单继承派生类的构造函数 派生类中包含有继承基类的成员和派生类中的新增成派生类中包含有继承基类的成员和派生类中的新增成员,在创建派生类的对象时,不仅要给派生类中的数据员,在创建派生类的对象时,不仅要给派生类中的数据成员初始化,还要给它从基类中继承过来的数据成员初成员初始化,还要给它从基类中继承过来的数据成员初始化。这样,在派生类的对象构造时,必须首先正确地始化。这样,在派生类的对象构造时,必须首先正确地构造这个对象中基类的成员。构造这个对象中基类的成员。派生类构造函数的一般形式为:派生类构造函数的一般形式为:派生类构造函数名派生类构
17、造函数名(总参数列表总参数列表):):基类构造函数名基类构造函数名(参参数列表数列表)派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句 创建派生类对象时首先调用基类的构造函数,然后才创建派生类对象时首先调用基类的构造函数,然后才执行派生类构造函数体内的语句。执行派生类构造函数体内的语句。class Tri /三角形类三角形类 double a,b,c;public:Tri(double x,double y,double z)a=x;b=y;c=z;cout调用基类的构造函数调用基类的构造函数endl;double Peri(void);/周长作为函数值返回周长作为函数值返回 do
18、uble Area(void);/面积作为函数值返回面积作为函数值返回;class Col:public Tri /公有继承公有继承Tri类类 double h;/表示三角柱体的高度表示三角柱体的高度public:Col(double x,double y,double z,double t):Tri(x,y,z)/三角柱体的构造函数,利用参数初始化三角形三边和高度三角柱体的构造函数,利用参数初始化三角形三边和高度 h=t;cout调用派生类的构造函数调用派生类的构造函数endl;double Volu()return Area()*h;void main()Col col(3,4,5,2);
19、/创建三角柱体对象创建三角柱体对象 coutcol的体积的体积:col.Volu()endl;/求求col的体积的体积程序运行后的结果为:程序运行后的结果为:调用基类的构造函数调用基类的构造函数调用派生类的构造函数调用派生类的构造函数col的体积的体积:12派生类对象释放时执行析构函数的顺序派生类对象释放时执行析构函数的顺序与构造函数相反,先执行派生类的析构与构造函数相反,先执行派生类的析构函数函数Col(),再执行其基类的析构函数,再执行其基类的析构函数Tri()13.2.2 多继承派生类的构造函数多继承派生类的构造函数 在多继承的情况下,由于派生类具有多个基类,在在多继承的情况下,由于派生
20、类具有多个基类,在创建派生类的对象时,同样首先构造派生类对象中基类创建派生类的对象时,同样首先构造派生类对象中基类的成员,的成员,调用基类构造函数的顺序按照它们继承时说明调用基类构造函数的顺序按照它们继承时说明的顺序的顺序,而不是派生类构造函数中列举的顺序。,而不是派生类构造函数中列举的顺序。多继承派生类构造函数的一般形式为:多继承派生类构造函数的一般形式为:派生类构造函数名派生类构造函数名(总参数列表总参数列表):基类基类1构造函数名构造函数名(参数参数列表列表1),基类基类2构造函数名构造函数名(参数列表参数列表2),基类基类n构造构造函数名函数名(参数列表参数列表n)派生类中新增数据成员
21、初始化语句派生类中新增数据成员初始化语句class Stu /学生类学生类 int stu_id;/代表学生学号代表学生学号 double score;/代表学生成绩代表学生成绩public:Stu(int n,double sc)/学生类的构造函数学生类的构造函数 stu_id=n;score=sc;cout调用学生类构造函数调用学生类构造函数endl;void ShowA()cout学号学号:stu_idt成绩成绩:scoreendl;class Emp/职工类职工类 int sta_id;/代表职工工号代表职工工号 double salary;/代表职工工资代表职工工资public:Em
22、p(int n,double sa)/职工类构造函数职工类构造函数 sta_id=n;salary=sa;cout调用职工类构造函数调用职工类构造函数endl;void ShowB()cout工号工号:sta_idt工资工资:salaryendl;class Stu_Emp:public Emp,public Stu/在职的学生类在职的学生类public:Stu_Emp(int n1,double sc,int n2,double sa):Stu(n1,sc),Emp(n2,sa)cout调用派生类构造函数调用派生类构造函数endl;void main()Stu_Emp s(10001,98,
23、20001,2000.0);s.ShowA();s.ShowB();程序运行后的结果为:程序运行后的结果为:调用职工类构造函数调用职工类构造函数调用学生类构造函数调用学生类构造函数调用派生类构造函数调用派生类构造函数学号学号:10001 成绩成绩:98工号工号:20001 工资工资:200013.2.3 有子对象的派生类的构造函数有子对象的派生类的构造函数 在类的数据成员中,还可以包括基类或其他类在类的数据成员中,还可以包括基类或其他类的对象,称为的对象,称为子对象子对象,即对象中的对象。子对象中,即对象中的对象。子对象中的数据成员在创建时同样需要初始化,所以,在派的数据成员在创建时同样需要初
24、始化,所以,在派生类构造函数的初始化列表中,不仅要列举所调用生类构造函数的初始化列表中,不仅要列举所调用的基类的构造函数,而且要列举所包含的子对象成的基类的构造函数,而且要列举所包含的子对象成员的构造函数。员的构造函数。其构造函数的一般形式为:其构造函数的一般形式为:派生类构造函数名派生类构造函数名(总参数列表总参数列表):):基类构造函数名基类构造函数名(参参数列表数列表),),子对象名子对象名(参数列表参数列表)派生类中新增数据成员初始化语句派生类中新增数据成员初始化语句 13.2.3 有子对象的派生类的构造函数有子对象的派生类的构造函数 执行派生类构造函数的顺序是:执行派生类构造函数的顺
25、序是:调用基类构造函数调用基类构造函数,调用顺序按照它们,调用顺序按照它们继承继承时时说明的顺序说明的顺序。调用子对象类的构造函数调用子对象类的构造函数,调用顺序按照它,调用顺序按照它们在们在类中说明的顺序类中说明的顺序。执行派生类构造函数体中的内容执行派生类构造函数体中的内容。派生类对象释放时派生类对象释放时执行析构函数的顺序执行析构函数的顺序正好与正好与构造函数构造函数相反相反。class Base1 int x;public:Base1(int a)x=a;cout调用基类调用基类1的构造函数的构造函数!n;Base1()cout调用基类调用基类1的析构函数的析构函数!n;class B
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 继承 派生 编辑
限制150内