C++程序设计第12章-继承和派生课件.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《C++程序设计第12章-继承和派生课件.pptx》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 程序设计 12 继承 派生 课件
- 资源描述:
-
1、第第 12 章章 继承和派生继承和派生12.1 继承的基本概念继承的基本概念 12.2 单一继承单一继承 12.3 多重继承多重继承 12.4 基类成员的初始化基类成员的初始化 12.5 二义性和支配规则二义性和支配规则 12.6 虚基类虚基类 12.7 访问基类成员和访问对象成员的成员访问基类成员和访问对象成员的成员 12.8 赋值兼容赋值兼容 第第 12 章章 继承和派生继承和派生 继承提供了在已有类的基础上开发出新类的机制,继承提供了在已有类的基础上开发出新类的机制,可以节省重复代码的编写工作,是软件重用的基础。可以节省重复代码的编写工作,是软件重用的基础。B AA派生类是对基类的扩充派
2、生类是对基类的扩充12.1 继承的基本概念继承的基本概念已知一个类已知一个类A,对,对A类加以扩展,即增加一些属性和类加以扩展,即增加一些属性和行为,构成一个新类行为,构成一个新类B,此时,此时B类将类将A类已有的属性和类已有的属性和行为继承下来。称类行为继承下来。称类 B 继承了继承了 A,或称类,或称类 A 派生了派生了 B。A:父类,基类父类,基类 BaseClassB:子类,派生类子类,派生类 DerivedClass在校人员类在校人员类学生类学生类职工类职工类(属性:属性:姓名,年龄,身高姓名,年龄,身高)增加属性:增加属性:学号学号 成绩成绩 增加属性:增加属性:部门部门 工资工资
3、 单一继承单一继承多重继承多重继承圆柱体类圆柱体类 圆类圆类 高度类高度类 组合组合(属性属性:圆心坐标圆心坐标,半径半径)(属性属性:高度高度)属性属性:圆心坐标圆心坐标,半径半径,高度高度在在C+中中,有有两种两种继承方式:继承方式:单一继承单一继承和和多重继承多重继承。12.2 单一继承单一继承定义派生类的一般格式:定义派生类的一般格式:class:private:/私有成员说明私有成员说明 .public:/公有成员说明公有成员说明 .protected:/保护成员说明保护成员说明 .;继承方式:继承方式:public 公有继承公有继承(派生派生)private 私有继承私有继承(派生
4、派生)protected 保护继承保护继承(派生派生)定义派生类新成员定义派生类新成员12.2.1 公有继承(派生)公有继承(派生)A B class A .;class B:public A /公有继承公有继承A .;A 类中的类中的 public 和和 protected 成员,成员,在在B 中仍然保持其原访问特性。中仍然保持其原访问特性。虽然虽然A中的私有成员也被继承下来了,中的私有成员也被继承下来了,但在但在B中不可直接访问。中不可直接访问。A 中的:中的:在在 B 中:中:在在B的类外的类外(通过对象通过对象)private 成员成员 不可访问不可访问 不可访问不可访问public成
5、员成员 仍为仍为 public 成员成员 可访问可访问protected成员成员 仍为仍为 protected 成员成员 不可访问不可访问相当于对相当于对B类做如下定义:类做如下定义:class B:private:int bx;protected:int ay;int by;public:int az;int bz;void f1().;int Getax().void Setax(int x)ax=x;void f2().;float f3().;private int ax;例如例如:继承关系如下:继承关系如下:class A private:int ax;protected:int a
6、y;public:int az;void f1().;int Getax()return ax;void Setax(int x)ax=x;class B:public A private:int bx;protected:int by;public:int bz;void f2().;float f3().;蓝色斜体是从蓝色斜体是从A类类继承的成员继承的成员在在 B 的成员函数中可直接的成员函数中可直接访问访问A类的类的ay,az,f1(),Getax(),Setax()相当于对相当于对B类做如下定义:类做如下定义:class B:private:int bx;protected:int a
7、y;int by;public:int az;int bz;void f1().;int Getax().void Setax(int x)ax=x;void f2().;float f3().;private int ax;例如例如:继承关系如下:继承关系如下:class A private:int ax;protected:int ay;public:int az;void f1().;int Getax()return ax;void Setax(int x)ax=x;class B:public A private:int bx;protected:int by;public:int
8、bz;void f2().;float f3().;在在B类中不可直接类中不可直接访问访问A类的成员类的成员ax可通过可通过 Getax()、Setax()访问访问A类的私有成员类的私有成员 ax 的值的值注意:注意:在在main()函数中,只定义一个函数中,只定义一个Circle类对象:类对象:int main()Circle c(0,0,2);c.ShowCircle();c.Move(2,2);c.ShowCircle();c.Setxy(0,0);/重新置圆心坐标重新置圆心坐标 c.Setr(1);/重新置半径值重新置半径值c.ShowCircle();return 0;使用一个使用一
9、个Circle类对象类对象 c 时,时,感觉感觉Circle类是一个完整的类,类是一个完整的类,就象就象 Point 类不存在一样。类不存在一样。如如Setxy()函数,它是在基类中函数,它是在基类中被定义的,现在它被定义的,现在它就是就是Circle类的类的成员了,但在成员了,但在Circle类中并没有类中并没有写出它的实现函数,代码是被继写出它的实现函数,代码是被继承下来的。承下来的。例例12.1见见“第第12章章 继承和派生继承和派生(例子例子).docx”面向对象程序设计中面向对象程序设计中继承性继承性的的优点优点就就在于此,系统提供了相当多的已定义好的在于此,系统提供了相当多的已定义
10、好的基类,用户可以根据具体的应用,基类,用户可以根据具体的应用,在已有在已有类的基础上构架新类类的基础上构架新类,在派生类中,可以,在派生类中,可以直接使用父类部分的代码,但却直接使用父类部分的代码,但却不需要重不需要重新编写父类的代码新编写父类的代码。这样可以加速软件开。这样可以加速软件开发的速度,保障软件开发的质量。继承性发的速度,保障软件开发的质量。继承性是软件重用的基础是软件重用的基础。在一个类上仅构架一个新类,意在一个类上仅构架一个新类,意义并不大。但如果构架多个新类,义并不大。但如果构架多个新类,那么就可以减少大量相同代码的重那么就可以减少大量相同代码的重复编写工作。如从一个复编写
11、工作。如从一个“点点”类可类可以派生出以派生出“线线”类、类、“圆圆”类、类、“长方形长方形”类等。类等。从本例中,还可以看出另一个问题:从本例中,还可以看出另一个问题:为了实现数据保护,在基类中将为了实现数据保护,在基类中将 x,y 定义定义为私有成员,但是带来一个问题,即在派为私有成员,但是带来一个问题,即在派生类中需通过公有成员函数生类中需通过公有成员函数Getx(),Setxy(x1,y1)等来访为基类的私有成员。等来访为基类的私有成员。如果在基类中将如果在基类中将 x,y 定义为保护定义为保护成员,则公有继承后,在派生类中成员,则公有继承后,在派生类中x,y 仍然是保护成员,在派生类
12、内可直接仍然是保护成员,在派生类内可直接访问。这样访问。这样既可以既可以保护基类数据成员,保护基类数据成员,又可以又可以在派生类中提供访问基类数据在派生类中提供访问基类数据成员的方便性。成员的方便性。12.2.2 私有继承(派生)私有继承(派生)A B class A .;class B:private A /私有继承私有继承A .将将 A 中的中的 public 和和 protected 成员均变成了成员均变成了B 的的 private 成员。成员。同理,同理,A中的私有成员被继承下来了,中的私有成员被继承下来了,但在但在B中不可直接访问,中不可直接访问,A 中的:中的:在在 B 中:中:在
13、类外在类外(类类B的对象中的对象中)private 成员成员 不可访问不可访问 不可访问不可访问public成员成员 变为变为 private 成员成员 不可访问不可访问protected成员成员 变为变为 private 成员成员 不可访问不可访问相当于对相当于对B类做如下定义:类做如下定义:class B:private:int bx;int ay;int az;void f1().;int Getax().void Setax(int x)ax=x;protected:int by;public:int bz;void f2().;float f3().;private int ax;例
14、如例如:继承关系如下:继承关系如下:class A private:int ax;protected:int ay;public:int az;void f1().;int Getax()return ax;void Setax(int x)ax=x;class B:private A private:int bx;protected:int by;public:int bz;void f2().;float f3().;蓝色斜体是从蓝色斜体是从A类类继承的成员继承的成员在在 B 的成员函数中可直接的成员函数中可直接访问访问A类的类的ay,az,f1(),Getax(),Setax()相当于对
15、相当于对B类做如下定义:类做如下定义:class B:private:int bx;int ay;int az;void f1().;int Getax().void Setax(int x)ax=x;protected:int by;public:int bz;void f2().;float f3().;private int ax;例如例如:继承关系如下:继承关系如下:class A private:int ax;protected:int ay;public:int az;void f1().;int Getax()return ax;void Setax(int x)ax=x;cla
16、ss B:private A private:int bx;protected:int by;public:int bz;void f2().;float f3().;在在B类中不可直接类中不可直接访问访问A类的成员类的成员ax可通过可通过 Getax()、Setax()访问访问A类的私有成员类的私有成员 ax 的值的值12.2.3 保护继承(派生)保护继承(派生)A B class A.;class B:protected A /保护继承保护继承A.A 中的:中的:在在 B 中:中:在类外在类外(类类B的对象中的对象中)private 成员成员 不可访问不可访问 不可访问不可访问public
17、成员成员 变为变为 protected 成员成员 不可访问不可访问protected成员成员 变为变为 protected成员成员 不可访问不可访问将将 A 中的中的 public 和和 protected 成员均变成了成员均变成了B 的的 protected 成员。成员。同理,同理,A中的私有成员被继承下来了,中的私有成员被继承下来了,但在但在B中不可直接访问,中不可直接访问,由于由于“私有继承私有继承”和和“保护继承保护继承”用得不多,用得不多,在这里不再详细叙述了。在这里不再详细叙述了。无论何种继承方式,无论何种继承方式,private成员是无法在派生类中被成员是无法在派生类中被直接访问
18、的。直接访问的。而对于而对于protected成员,根据不同的派生方式,成员,根据不同的派生方式,protected成员的直接访问特性可以被(或不被)传递成员的直接访问特性可以被(或不被)传递到派生类的派生类中。到派生类的派生类中。12.2.4 private成员和成员和protected成员的区别成员的区别 1对于公有派生,基类的对于公有派生,基类的protected成员在派生成员在派生类中依然保持类中依然保持protected属性属性。2对于私有派生,基类的对于私有派生,基类的protected成员在派生成员在派生类中变成了类中变成了private成员,此时基类成员,此时基类的的prote
19、cted成员成员就再也无法在派生类的派生类中被直接访就再也无法在派生类的派生类中被直接访问了。在继承或派生链中,一旦出现私有继承,问了。在继承或派生链中,一旦出现私有继承,则父类的成员的则父类的成员的“类内直接访问特性类内直接访问特性”就无法就无法在后面的派生中传递下去。在后面的派生中传递下去。3对于保护派生,基类的对于保护派生,基类的protected成员在派生成员在派生类中依然保持类中依然保持protected属性,此时情况与公有属性,此时情况与公有派生类似。派生类似。类中类中protected成员的优点成员的优点是:既可以在本类中实是:既可以在本类中实现数据的隐藏(在类外不可被直接访问)
展开阅读全文