c++语言程序设计(郑莉第四版)课件7

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1第七章继承与派生清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容类的继承类成员的访问控制单继承与多继承派生类的构造、析构函数类成员的标识与访问深度探索C++语言程序设计清华大学郑莉3类的继承与派生保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类(或子类)。C++语言程序设计清华大学郑莉4继承与派生问题举例单继承(UML图)圆矩形几何形状类的继承与派生C++语言程序设计清华大学郑莉5猴子狮子虎猎豹猫鸟动物类的继承与派生猫科继承与派生问题举例单继承(UML图)C++语言程序设计清华大学郑莉6类的继承与派生工具车轿车面包车卡车汽车小汽车汽车交通工具火车飞机轮船继承与派生问题举例单继承(UML图)C++语言程序设计清华大学郑莉7兼职技术人员销售经理管理人员销售人员雇员类的继承与派生继承与派生问题举例多继承(UML图)C++语言程序设计清华大学郑莉8继承与派生的目的继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。类的继承与派生C++语言程序设计清华大学郑莉9派生类的生成过程吸收基类–包含除构造和析构函数之外的所有成员改造基类成员–通过定义继承方式实现对基类成员的访问控制–对基类成员的覆盖和隐藏(声明同名成员)添加新成员–是继承与派生机制的核心,是保证派生类在功能上有所发展的关键。类的继承与派生C++语言程序设计清华大学郑莉10派生类的声明class派生类名:继承方式基类名{成员声明;}类的继承与派生C++语言程序设计清华大学郑莉11继承方式不同继承方式的影响主要体现在:–派生类成员对基类成员的访问权限–通过派生类对象对基类成员的访问权限三种继承方式–公有继承–私有继承(默认)–保护继承类成员的访问控制C++语言程序设计清华大学郑莉12公有继承(public)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。类成员的访问控制C++语言程序设计清华大学郑莉13例7-1公有继承举例classPoint{//基类Point类的定义public://公有函数成员voidinitPoint(floatx=0,floaty=0){this-x=x;this-y=y;}voidmove(floatoffX,floatoffY){x+=offX;y+=offY;}floatgetX()const{returnx;}floatgetY()const{returny;}private://私有数据成员floatx,y;};类成员的访问控制classRectangle:publicPoint{//派生类定义部分public://新增公有函数成员voidinitRectangle(floatx,floaty,floatw,floath){initPoint(x,y);//调用基类公有成员函数this-w=w;this-h=h;}floatgetH()const{returnh;}floatgetW()const{returnw;}private://新增私有数据成员floatw,h;};14#includeiostream#includecmathusingnamespacestd;intmain(){Rectanglerect;//定义Rectangle类的对象//设置矩形的数据rect.initRectangle(2,3,20,10);rect.move(3,2);//移动矩形位置coutThedataofrect(x,y,w,h):endl;//输出矩形的特征参数coutrect.getX(),rect.getY(),rect.getW(),rect.getH()endl;return0;}15C++语言程序设计清华大学郑莉16私有继承(private)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员(如果进一步继承,基类的全部成员就无法在新的派生类中被直接访问),但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。类成员的访问控制C++语言程序设计清华大学郑莉17例7-2私有继承举例classRectangle:privatePoint{//派生类定义部分public://新增公有函数成员voidinitRectangle(floatx,floaty,floatw,floath){initPoint(x,y);//调用基类公有成员函数this-w=w;this-h=h;}voidmove(floatoffX,floatoffY){Point::move(offX,offY);}floatgetX()const{returnPoint::getX();}floatgetY()const{returnPoint::getY();}floatgetH()const{returnh;}floatgetW()const{returnw;}private://新增私有数据成员floatw,h;};类成员的访问控制#includeiostream#includecmathusingnamespacestd;intmain(){Rectanglerect;//定义Rectangle类的对象rect.initRectangle(2,3,20,10);//设置矩形的数据rect.move(3,2);//移动矩形位置coutThedataofrect(x,y,w,h):endl;coutrect.getX(),//输出矩形的特征参数rect.getY(),rect.getW(),rect.getH()endl;return0;}18C++语言程序设计清华大学郑莉19保护继承(protected)基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。在直接派生类中所有成员的访问属性与私有继承相同。如果进一步继承,二者的区别就出来了。保护成员可以被派生类访问,但是不能被外部的使用者访问。类成员的访问控制C++语言程序设计清华大学郑莉20protected成员的特点与作用对建立其所在类对象的模块来说,它与private成员的性质相同。对于其派生类来说,它与public成员的性质相同。如果合理地利用保护成员,就可以在类的复杂层次关系中在共享与成员隐蔽之间找到一个平衡点。既实现了数据隐藏,又方便继承,实现代码重用和扩充。类成员的访问控制C++语言程序设计清华大学郑莉21例7-3protected成员举例classA{protected:intx;};intmain(){Aa;a.x=5;//错误}类成员的访问控制classA{protected:intx;};classB:publicA{public:voidfunction();};voidB:function(){x=5;//正确}22C++语言程序设计清华大学郑莉23类型兼容规则一个公有派生类的对象在使用上可以被当作基类的对象,反之则禁止。具体表现在:–派生类的对象可以隐含转换为基类对象。–派生类的对象可以初始化基类的引用。–派生类的指针可以隐含转换为基类的指针。通过基类对象名、指针只能使用从基类继承的成员类型兼容C++语言程序设计清华大学郑莉24例7-4类型兼容规则举例#includeiostreamusingnamespacestd;classBase1{//基类Base1定义public:voiddisplay()const{coutBase1::display()endl;}};类型兼容classBase2:publicBase1{//公有派生类Base2定义public:voiddisplay()const{coutBase2::display()endl;}};classDerived:publicBase2{//公有派生类Derived定义public:voiddisplay()const{coutDerived::display()endl;}};voidfun(Base1*ptr){//参数为指向基类对象的指针ptr-display();//对象指针-成员名}25intmain(){//主函数Base1base1;//声明Base1类对象Base2base2;//声明Base2类对象Derivedderived;//声明Derived类对象//用Base1对象的指针调用fun函数fun(&base1);//用Base2对象的指针调用fun函数fun(&base2);//用Derived对象的指针调用fun函数fun(&derived);return0;}运行结果:Base1::display()Base1::display()Base1::display()26C++语言程序设计清华大学郑莉27基类与派生类的对应关系单继承–派生类只从一个基类派生。多继承–派生类从多个基类派生。多重派生–由一个基类派生出多个不同的派生类。多层派生–派生类又作为基类,继续派生新的类。单继承与多继承C++语言程序设计清华大学郑莉28多继承时派生类的声明class派生类名:继承方式1基类名1,继承方式2基类名2,...{成员声明;}注意:每一个“继承方式”,只用于限制对紧随其后之基类的继承。单继承与多继承C++语言程序设计清华大学郑莉29多继承举例classA{public:voidsetA(int);voidshowA()const;private:inta;};classB{public:voidsetB(int);voidshowB()const;private:intb;};classC:publicA,privateB{public:voidsetC(int,int,int);voidshowC()const;privateconst:intc;};单继承与多继承voidA::setA(intx){a=x;}voidB::setB(intx){b=x;}voidC::setC(intx,inty,intz){//派生类成员直接访问基类的//公有成员setA(x);setB(y);c=z;}//其他函数实现略intmain(){Cobj;obj.setA(5);obj.showA();obj.setC(6,7,9);obj.showC();//obj.setB(6);错误//obj.showB();错误return0;}30C++语言程序设计清华大学郑莉31继承时的构造函数基类的构造函数不被继承,派生类中需要声明自己的构造函数。定义构造函数时,只需要对本类中新增成员进行初始化,对继承来的基类成员的初始化,自动调用基类构造函数完成。派生类的构造函数需要给基类的构造函数传递参数派生类的构造、析构函数C++语言程序设计清华大学郑莉32单一继承时的构造函数派生类名::派生类名(基类所需的形参,本类成员所需的形参):基类名(参数表){本类成员初始化赋值语句;};如果对基类初始化时,

1 / 84
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功