ImageVerifierCode 换一换
格式:PPTX , 页数:44 ,大小:220.14KB ,
文档编号:3514906      下载积分:25 文币
快捷下载
登录下载
邮箱/手机:
温馨提示:
系统将以此处填写的邮箱或者手机号生成账号和密码,方便再次下载。 如填写123,账号和密码都是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

优惠套餐
 

温馨提示:若手机下载失败,请复制以下地址【https://www.163wenku.com/d-3514906.html】到电脑浏览器->登陆(账号密码均为手机号或邮箱;不要扫码登陆)->重新下载(不再收费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录  
下载须知

1: 试题类文档的标题没说有答案,则无答案;主观题也可能无答案。PPT的音视频可能无法播放。 请谨慎下单,一旦售出,概不退换。
2: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
3: 本文为用户(三亚风情)主动上传,所有收益归该用户。163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

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

C++程序设计第12章-继承和派生课件.pptx

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成员的优点成员的优点是:既可以在本类中实是:既可以在本类中实现数据的隐藏(在类外不可被直接访问)

20、,又现数据的隐藏(在类外不可被直接访问),又可以将其类内直接访问特性传递到派生类中可以将其类内直接访问特性传递到派生类中(在派生类中可直接访问)。但(在派生类中可直接访问)。但private成员成员只只能实现能实现本类中的本类中的数据数据隐藏,而不能将其类内直隐藏,而不能将其类内直接访问特性传递到派生类中。接访问特性传递到派生类中。12.3 多重继承多重继承一般格式:一般格式:class:,/以下定义派生类新成员以下定义派生类新成员 private:/私有成员说明私有成员说明 .public:/公有成员说明公有成员说明 .protected:/保护成员说明保护成员说明 .;多个基类派生一个类多

21、个基类派生一个类多重继承多重继承Circle 类类Point类类 Radius类类 组合组合再次说明保护成员的优点再次说明保护成员的优点例例12.2 见见“第第12章章 继承和派生继承和派生(例子例子).docx”注意例注意例12.2的的D行,行,若一个类是由多个基类派生出来的,若一个类是由多个基类派生出来的,则在定义派生类构造函数时,则在定义派生类构造函数时,应调用基类的构造函数,以初始化基类成员。应调用基类的构造函数,以初始化基类成员。12.4 基类成员的初始化基类成员的初始化12.4.1 基类的构造函数和析构函数的调用顺序基类的构造函数和析构函数的调用顺序 派生类构造函数的一般格式:派生

22、类构造函数的一般格式:ClassName:ClassName(args):Base1(arg1),Base2(arg2),.Basen(argn);其中其中ClassName是派生类名,是派生类名,Base1、Base2、.Basen为基类的类名。为基类的类名。args是派生类自身的构造函数的形参是派生类自身的构造函数的形参列表,列表,arg1、arg2、.argn是调用基类构造函数的实参是调用基类构造函数的实参列表。列表。析构函数的调用顺序为:(相反)析构函数的调用顺序为:(相反)先执行派生类自身的析构函数体、然后按先执行派生类自身的析构函数体、然后按 Basen()、.Base2()、Ba

23、se1()例例12.3 见见“第第12章章 继承和派生继承和派生(例子例子).docx”构造函数的调用顺序为:构造函数的调用顺序为:Base1()、Base2()、.Basen()、最后执行最后执行。在例在例12.3中:中:调用基类的构造函数的顺序并不是调用基类的构造函数的顺序并不是B行的书写顺序决行的书写顺序决定的,而是定的,而是A行定义派生类时的派生顺序决定的,即行定义派生类时的派生顺序决定的,即使将使将B行改写成行改写成Derived(int x,int y,int z):Base2(y),Base1(x),程序的运行结果依然不变。,程序的运行结果依然不变。12.4.2 对象成员构造函数

24、和析构函数的调用顺序对象成员构造函数和析构函数的调用顺序 例例12.4 见见“第第12章章 继承和派生继承和派生(例子例子).docx”或见下一页简化例子:或见下一页简化例子:若若派生类中包含对象成员派生类中包含对象成员,则在派生类的构造函数的,则在派生类的构造函数的初始化成员列表中:初始化成员列表中:不仅要列举基类的构造函数,不仅要列举基类的构造函数,而且要列举对象成员的构造函数而且要列举对象成员的构造函数class Base1 int data1;public:Base1(int a)data1=a;.;class Base2 int data2;public:Base2(int a)da

25、ta2=a;.;class Derived:public Base1,public Base2/公有继承公有继承基类基类 int d;Base1 b1,b2;/对象成员对象成员public:Derived(int a,int b):Base1(a),Base2(20),b1(200),b2(a+b)d=a;.先调用基类的构造函数先调用基类的构造函数再调用对象成员的构造函数再调用对象成员的构造函数最后执行对象自身的构造函数最后执行对象自身的构造函数问题见下页问题见下页问题:对本例,一个问题:对本例,一个Derived类的类的对象有几个数据成员?对象有几个数据成员?(包括自身具备的、和继承来(包括

26、自身具备的、和继承来的?的?)返回返回12.5 二义性和支配规则二义性和支配规则12.5.1 二义性二义性(多重继承带来的访问冲突多重继承带来的访问冲突)例例12.5class A protected:int x;public:A(int a)x=a;.;class B protected:int x;public:B(int a)x=a;.;class C:public A,public B/公有继承公有继承 A 和和 B int y;public:void Setx(int a)x=a;.;当基类当基类 A和和 B 中中出现两个同名的出现两个同名的成员成员 x 时,时,在派生类中在派生类中

27、访问访问 x 出现二义性出现二义性问题:一个类问题:一个类C的对象有几个数据成员?的对象有几个数据成员?class A protected:int x;public:A(int a)x=a;.;class B protected:int x;public:B(int a)x=a;.;class C:public A,public B/公有继承公有继承 A 和和 B int y;public:void Setx(int a)x=a;.;解决办法:解决办法:将此句改为:将此句改为:A:x=a;或或 B:x=a;同理:解决基类同名成员函数同理:解决基类同名成员函数的访问的访问class C:publ

28、ic A,public B/公有继承公有继承 A 和和 Bint y;public:void SetAx(int a)A:x=a;/对类对类A中的中的x置值置值void SetBx(int a)B:x=a;/对类对类B中的中的x置值置值void Sety(int b)y=b;int Gety()return y;int main()C c1;c1.SetAx(35);c1.SetBx(45);c1.Sety(300);coutY=c1.Gety()endl;return 0;例例12.6 部分代码,解决访问冲突部分代码,解决访问冲突 C A B 注意:如何解决冲突注意:如何解决冲突 (访问二义

29、性访问二义性)。)。当把派生类作为基类,又派生出新的派生类时,这种限当把派生类作为基类,又派生出新的派生类时,这种限定作用域的运算符不能连续嵌套使用,如下形式的使用定作用域的运算符不能连续嵌套使用,如下形式的使用方式是不允许的:方式是不允许的::例例12.7 见见“第第12章章 继承和派生继承和派生(例子例子).docx”如何解决多层继承中的冲突,请看下例:如何解决多层继承中的冲突,请看下例:由于由于C+是通过作用域运算符来解决访问二义性问题,是通过作用域运算符来解决访问二义性问题,因此因此规定任一基类在派生类中只能被直接继承一次规定任一基类在派生类中只能被直接继承一次,否,否则会造成成员名访

30、问的冲突。例如:则会造成成员名访问的冲突。例如:class A public:float x;.;class B:public A,public A /错误的错误的.;B类的定义是错误的,因为如果直接从类的定义是错误的,因为如果直接从A类继承两次,类继承两次,通过作用域运算符就无法解决访问二义性问题。通过作用域运算符就无法解决访问二义性问题。12.5.2 支配规则支配规则例例12.8 支配规则示例支配规则示例 见见“第第12章章 继承和派生继承和派生(例子例子).docx”问题:问题:类类 C 有几个数据成员。有几个数据成员。基类和派生类出现同名成员时,基类和派生类出现同名成员时,派生类成员访

31、问优先派生类成员访问优先-支配规则支配规则12.6 虚基类虚基类 类类D 基类基类B 基类基类C 基类基类A 基类基类A 如右图的公有继承关系中,如右图的公有继承关系中,在类在类 D 中包含了基类中包含了基类 A 的的 两个拷贝。两个拷贝。在类在类 D 的成员函数中,的成员函数中,欲访问欲访问 A 的成员的成员 x,则必须以则必须以 B:x 和和 C:x 区分。区分。B DA C A一个一个D类对象的存储空间类对象的存储空间 若欲使公共的基类若欲使公共的基类A 在派生类中只有一个拷贝,在派生类中只有一个拷贝,如右图,如右图,可将可将 A 说明成说明成虚基类虚基类。说明的方法:说明的方法:继承时

32、,在基类的类名前继承时,在基类的类名前 加上关键词:加上关键词:virtual 类类D 基类基类B 基类基类C 基类基类A 例例12.10 虚基类的例子虚基类的例子见下页:见下页:B D C A一个一个D类对象的存储空间类对象的存储空间 class A protected:int x;public:A(int a=0)x=a;class B:virtual public A protected:int y;public:B(int a=0,int b=0):A(a)y=b;class C:public virtual A protected:int z;public:C(int a=0,int

33、 c=0):A(a)z=c;注意:注意:virtual 的的位置。位置。class D:public B,public C protected:int k;B(a1,b),C(a2,c),k(d)public:D(int a1=0,int a2=0,int b=0,int c=0,int d=0):void Show()cout x=x ,;cout y=y ,;cout z=z ,;cout k=k endl;int main(void)D obj(1,1,2,3,4);obj.Show();return 0;发挥发挥 程序的运行结果是:程序的运行结果是:x=0,y=2,z=3,k=4问题:

34、类问题:类 D 有几个数据成员有几个数据成员?B 和和 C 的构造函数中的构造函数中,分别调用分别调用 A的构造函数,的构造函数,编译器无法确定调用哪一个来初始化编译器无法确定调用哪一个来初始化A,在这种情况下,约定直接在这种情况下,约定直接调用调用 A 的缺省构造函数。的缺省构造函数。(即使(即使 a1 和和 a2 的值相等)的值相等)如将如将G行改为行改为:D(int a1=0,int a2=0,int b=0,int c=0,int d=0):B(a1,b),C(a2,c),A(a1),k(d)/G 则程序的运行结果变为:则程序的运行结果变为:x=1,y=2,z=3,k=4 注意:注意:

35、如果派生类有多个基类,有些是虚基类有些是如果派生类有多个基类,有些是虚基类有些是非虚基类。则基类构造的调用顺序是先调用虚基类的非虚基类。则基类构造的调用顺序是先调用虚基类的构造函数再调用非虚基类的构造函数,并按照继承顺构造函数再调用非虚基类的构造函数,并按照继承顺序调用。序调用。直接调用虚基类的构造函数直接调用虚基类的构造函数例例12.11 见见“第第12章章 继承和派生继承和派生(例子例子).docx”在成员函数中在成员函数中:(1)使用基类的成员使用基类的成员 (2)使用对象成员的成员时,使用对象成员的成员时,情况不同情况不同12.7 访问基类成员和访问对象成员的成员访问基类成员和访问对象

36、成员的成员class A public:int x;A(int a=0)x=a;class B:public A/公有继承公有继承 A int y;A a1;/类类 A 的对象作为的对象作为 B 类的对象成员类的对象成员public:.void Show()cout“x=“x endl;cout “y=“a1.x endl;直接使用基类成员直接使用基类成员 使用对象使用对象a1的成员的成员 C+规定同一个基类不可以被直接继承两次以上。规定同一个基类不可以被直接继承两次以上。那么有时在一个类中又必须具有两个已有类的对象,那么有时在一个类中又必须具有两个已有类的对象,如何来解决这个问题呢?如何来解

37、决这个问题呢?请看例请看例12.12,先定义一个点类,先定义一个点类Point,由于两点构,由于两点构成一条直线,那么可由两个点的对象构成线类成一条直线,那么可由两个点的对象构成线类Line。12.7.1 访问对象成员的成员访问对象成员的成员 例例12.12 见见“第第12章章 继承和派生继承和派生(例子例子).docx”有了有了Point类后,还可以使用继承的方法实现类后,还可以使用继承的方法实现Line类类 12.7.2 访问基类成员访问基类成员 例例12.13 见见“第第12章章 继承和派生继承和派生(例子例子).docx”例例12.12和和例例12.13,在主函数中使用,在主函数中使用

38、Line类的方式没类的方式没有什么差别,运行结果也一样。但类的实现是不一样有什么差别,运行结果也一样。但类的实现是不一样的,本例使用继承的方法实现的,本例使用继承的方法实现Line类,在类,在Line类中可类中可以直接访问基类保护成员以直接访问基类保护成员x、y(见程序(见程序A行的注释)。行的注释)。而在例而在例12.12 Line类中是通过对象成员的公有函数接类中是通过对象成员的公有函数接口访问对象成员的成员的。口访问对象成员的成员的。12.8 赋值兼容赋值兼容赋值兼容规则为赋值兼容规则为:可以将:可以将公有派生类对象公有派生类对象赋值赋值给基类对象,反之是不允许的。给基类对象,反之是不允

39、许的。基类基类对象对象 派生类派生类 基类基类对象对象结果结果:将派生类对象中从基类继承来的成员将派生类对象中从基类继承来的成员 赋给基类对象。赋给基类对象。例例12.14 见见“第第12章章 继承和派生继承和派生(例子例子).docx”赋值兼容与限制可归结为以下五点:赋值兼容与限制可归结为以下五点:1派生类对象可以赋值给基类对象,系统将派生类派生类对象可以赋值给基类对象,系统将派生类对象中从基类继承来的成员赋给基类对象。对象中从基类继承来的成员赋给基类对象。2不能将基类对象赋值给派生类对象。不能将基类对象赋值给派生类对象。3私有或保护继承的派生类对象,不可以赋值给基私有或保护继承的派生类对象,不可以赋值给基类对象。类对象。4可将派生类对象的地址赋给基类的指针变量。例可将派生类对象的地址赋给基类的指针变量。例如如 Point*ptr=&line;5派生类对象可初始化基类的引用。例如派生类对象可初始化基类的引用。例如 Point&refp=line;注意,注意,在后两种情况下,使用基类指针或引用时,只在后两种情况下,使用基类指针或引用时,只能访问从相应基类中继承来的成员,而不允许访问其能访问从相应基类中继承来的成员,而不允许访问其他基类成员或派生类中增加的成员。他基类成员或派生类中增加的成员。本章完本章完

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

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


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