已阅读5页,还剩55页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第五章继承与派生,5.1继承与派生的概念5.2派生类的声明方式5.3派生类的构成5.4派生类成员的访问属性5.5派生类的构造函数和析构函数5.6多重继承,面向对象程序的4个主要特点:抽象-类是对象的抽象,对象是类的具体化。封装-数据与操作封装在一个对象中;对象中某些数据对外隐蔽。继承-“软件重用”。多态性-由继承产生不同的类,其对象对同一个消息作出的不同反应。,复习:,继承:保持已有类的特性而构造新类的过程,它是类之间定义的一种重要关系(共性)。派生:是在已有类的基础上新增自己的特性而产生新类的过程(个性)。基类(或父类):被继承的已存在的类。派生类(或子类):派生出的新类。,5.1继承与派生的概念,继承与派生的例子:,不具有对称性不是所有植物都属于蕨类,传递性高等植物、蕨类植物、芒萁都是植物,具有植物的共同特征,植物,5.1继承与派生的概念,单继承:一个派生类只从一个基类派生。,多继承:一个派生类可以从两个或多个基类派生。,基类与派生类的关系:派生类是基类的具体化,而基类则是派生类的抽象。,5.2派生类的声明方式,声明基类的格式:class派生类名声明派生类的格式:class派生类名:继承方式基类名新增加的数据成员和成员函数声明;,基类继承过来的成员(共性)派生类中的成员自己增加的成员(个性),5.3派生类的构成,新增加的成员,派生类将基类除构造函数和析构函数外的所有成员接收过来。,派生类中包含了基类成员和派生类成员,就产生了这两部分成员的关系和访问属性的问题。,5.4.1派生类成员的访问属性,成员的访问属性(复习)私有成员(private):可以被类自身的成员和友元访问,但不能被其他任何类和任何普通函数访问。公有成员(public):可以被任何普通函数和任何类的成员函数访问。保护成员(protected):可以被类自身的成员和友元访问外。,三种继承方式:-公有继承-私有继承-保护继承,5.2.1访问控制,1.公有继承,基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。,公用继承示例:,classStudent/声明基类private:intnum;public:voidget_value()cinnum;voiddisplay()coutage;voiddisplay_1()coutnum:numendl;coutage:agenum;voiddisplay()coutage;voiddisplay_1()coutnum:numendl;coutage:agey;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:publicApublic:intget_S()returns;voidmake_S()s=x*y;/使用基类数据成员x,yprotected:ints;voidmain()AobjA;BobjB;coutItisobject_A:n;objA.get_XY();objA.put_XY();coutItisobject_B:n;objB.get_XY();objB.make_S();coutS=objB.get_S()endl;,公有继承的测试1,5.2.1访问控制,调用派生类B成员函数对objB的数据成员操作,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;Bb;b.addX();b.addY();couta.x=a.out()endl;coutb.x=b.out()endl;coutb.y=b.show()endl;,公有继承的测试2,5.2.1访问控制,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;Bb;b.addX();b.addY();couta.x=a.out()endl;coutb.x=b.out()endl;coutb.y=b.show()endl;,公有继承的测试2,基类的私有数据成员不能在派生类中直接访问但派生类对象也会对基类私有数据建立空间,5.2.1访问控制,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,调用构造函数对数据成员赋值,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,创建派生类对象调用基类构造函数派生类构造函数b.x=1b.y=1,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,调用基类公有成员函数b.x+,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,调用派生类公有成员函数b.y+,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,调用基类函数返回b.x的值,5.2.1访问控制,公有继承的测试2,#includeclassApublic:A()x=1;intout()returnx;voidaddX()x+;private:intx;classB:publicApublic:B()y=1;intshow()returny;voidaddY()y+;private:inty;voidmain()Aa;couta.x=a.out()endl;Bb;b.addX();b.addY();coutb.x=b.out()endl;coutb.y=b.show()endl;,调用派生类成员函数返回b.y的值,5.2.1访问控制,公有继承的测试2,5.2.1访问控制,2.私有继承,基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。,私有继承示例:,classStudent/声明基类private:intnum;public:voiddisplay()coutnum:numendl;classStudent1:privateStudent/私有继承方式声明派生类student1private:intage;public:voiddisplay_1()coutage:agey;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:privateApublic:intget_S()returns;voidmake_S()get_XY();s=x*y;private:ints;voidmain()BobjB;coutItisobject_B:n;objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:privateApublic:intget_S()returns;voidmake_S()get_XY();s=x*y;private:ints;voidmain()BobjB;coutItisobject_B:n;objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:privateApublic:intget_S()returns;voidmake_S()get_XY();s=x*y;private:ints;voidmain()BobjB;coutItisobject_B:n;objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:privateApublic:intget_S()returns;voidmake_S()get_XY();s=x*y;private:ints;voidmain()BobjB;coutItisobject_B:n;objB.make_S();coutS=objB.get_S()y;voidput_XY()coutx=x,y=yn;protected:intx,y;classB:privateApublic:intget_S()returns;voidmake_S()get_XY();s=x*y;private:ints;voidmain()BobjB;coutItisobject_B:n;objB.make_S();coutS=objB.get_S()endl;,5.2.1访问控制,私有继承的测试,访问私有数据成员,5.2.1访问控制,3.保护继承,基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。,保护继承示例:,classStudent/声明基类protect:intnum;public:voiddisplay()coutnum:numendl;classStudent1:protectedStudent/私有继承方式声明派生类student1private:intage;public:voiddisplay_1()cout“num:”numendl;coutage:ageendl;intmain()student1stud1;stud1.display();stud1.display_1();return0;,错误,保护基类中的display函数在派生类中为保护成员函数,类外不可直接调用。,正确,引用基类的保护成员num。,protect的特点与作用:对建立其所在类对象的模块来说,它与private成员的性质相同。如果基类只进行了一次派生,则保护继承和私有继承的功能完全相同。对于其派生类来说,它与public成员的性质相同。保护继承可以进一步派生,而私有继承则不可以,两者具有实质性差别。既实现了数据隐藏,又方便继承,实现代码重用。,基类成员与派生类成员的访问属性:,类A为基类,类B是类A的派生类,类C是类B的派生类,则类C也是类A的派生类。类B是类A的直接派生类,类C是类A的间接派生类。类A是类B的直接基类,是类C的间接基类。多级派生各成员访问属性仍满足以上原则。,5.4.2多级派生时的访问属性,多级继承示例:,公有,私有,公有,不可访问,保护,保护,保护,私有,保护,公有,保护,不可访问,公有,保护,私有,保护,保护,保护,保护,不可访问,各个成员在不同类中访问属性:,如果派生类定义了与基类同名的成员,在派生类中访问同名成员时屏蔽了基类的同名成员。在派生类中使用基类的同名成员,显式地使用类名限定符。格式:类名:成员重名成员包括:重名数据成员和重名成员函数。,5.2.2重名成员,5.4.2重名成员,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,1.重名数据成员,baseab,derivedabbc,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,1.重名数据成员,baseab,derivedabbc,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,baseab,derivedabbc,访问从base类继承的数据成员a,1.重名数据成员,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,访问从base类继承的b,baseab,derivedabbc,1.重名数据成员,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,访问derived类定义的数据成员b,baseab,derivedabbc,1.重名数据成员,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,访问derived类定义的数据成员c,baseab,derivedabbc,1.重名数据成员,例:classbasepublic:inta,b;classderived:publicbasepublic:intb,c;voidf()derivedd;d.a=1;d.base:b=2;d.b=3;d.c=4;,5.2.2重名成员,baseab,derivedabbc,基类成员的作用域延伸到所有派生类派生类的重名成员屏蔽基类的同名成员,1.重名数据成员,#includeclassApublic:inta1,a2;A(inti1=0,inti2=0)a1=i1;a2=i2;voidprint()couta1=a1ta2=a2endl;classB:publicApublic:intb1,b2;B(intj1=1,intj2=1)b1=j1;b2=j2;voidprint()/定义同名函数coutb1=b1tb2=b2endl;voidprintAB()A:print();/派生类对象调用基类版本同名成员函数print();/派生类对象调用自身的成员函数;voidmain()Bb;b.A:print();b.printAB();,5.2.2重名成员,2.重名成员函数,voidprint()couta1=a1ta2=a2endl;,voidprint()/定义同名函数coutb1=b1tb2=b2endl;,#includeclassApublic:inta1,a2;A(inti1=0,inti2=0)a1=i1;a2=i2;voidprint()couta1=a1ta2=a2endl;classB:publicApublic:intb1,b2;B(intj1=1,intj2=1)b1=j1;b2=j2;voidprint()/定义同名函数coutb1=b1tb2=b2endl;voidprintAB()A:print();/派生类对象调用基类版本同名成员函数print();/派生类对象调用自身的成员函数;voidmain()Bb;b.A:print();b.printAB();,5.2.2重名成员,2.重名成员函数,voidprint()couta1=a1ta2=a2endl;,voidprint()/定义同名函数coutb1=b1tb2=b2endl;,派生类屏蔽基类同名成员函数调用自身的成员函数,#includeclassApublic:inta1,a2;A(inti1=0,inti2=0)a1=i1;a2=i2;voidprint()couta1=a1ta2=a2endl;classB:publicApublic:intb1,b2;B(intj1=1,intj2=1)b1=j1;b2=j2;voidprint()/定义同名函数coutb1=b1tb2=b2endl;voidprintAB()A:print();/派生类对象调用基类版本同名成员函数print();/派生类对象调用自身的成员函数;voidmain()Bb;b.A:print();b.printAB();,5.2.2重名成员,2.重名成员函数,voidprint()couta1=a1ta2=a2endl;,voidprint()/定义同名函数coutb1=b1tb2=b2endl;,派生类对象调用从基类继承的同名成员函数,#includeclassApublic:inta1,a2;A(inti1=0,inti2=0)a1=i1;a2=i2;voidprint()couta1=a1ta2=a2endl;classB:publicApublic:intb1,b2;B(intj1=1,intj2=1)b1=j1;b2=j2;voidprint()/定义同名函数coutb1=b1tb2=b2endl;voidprintAB()A:print();/派生类对象调用基类版本同名成员函数print();/派生类对象调用自身的成员函数;voidmain()Bb;b.A:print();b.printAB();,5.2.2重名成员,2.重名成员函数,voidprint()couta1=a1ta2=a2endl;,voidprint()/定义同名函数coutb1=b1tb2=b2endl;,基类this指针指向派生类对象,#includeclassApublic:inta1,a2;A(inti1=0,inti2=0)a1=i1;a2=i2;voidprint()couta1=a1ta2=a2endl;cl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 太阳能光伏发电站的经济效益与环保效果评估
- 5G时代智能设备换电策略与市场预测报告
- 险公估从业资格考试及答案解析
- 2024年杭州临平招聘事业编制教师笔试真题
- 慈善组织与宠物救助相结合的共享模式研究报告
- 教育行业数字孪生技术推动教育信息化发展研究
- 宠物放射治疗技术:从传统到现代的转变
- 铁路轨道材料循环利用的可行性研究报告
- 2025年靖江市公益性岗位招聘真题
- 2024年华西医院成办分院招聘笔试真题
- 癸酉本石头记
- 研学旅行主题活动设计案例
- 大话机器人智慧树知到期末考试答案2024年
- 轮椅运用和床椅转移课件
- 无期限的六合公式汇编
- 先张法预应力混凝土管桩基础技术规程
- 基层应急能力提升课件培训
- 全国优质课一等奖中职《就业与创业指导》课件
- SBAR交接班模式在临床运用
- 催化裂化-认识催化裂化(石油加工课件)
- 超级方便的钢琴键盘和弦对照表
评论
0/150
提交评论