资源预览内容
第1页 / 共25页
第2页 / 共25页
第3页 / 共25页
第4页 / 共25页
第5页 / 共25页
第6页 / 共25页
第7页 / 共25页
第8页 / 共25页
第9页 / 共25页
第10页 / 共25页
亲,该文档总共25页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,第九讲 派生与继承性,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,派 生 类 (derived class),为什么引入派生类 自然地表示现实世界,是复杂的系统层次化,提高代码的重用性,增强语言功能,提高软件开发效益.,例如关于雇员和车辆的层次关系:,Teacher(教师),Officer(行政),Worker(工人),Employee(雇员),Car(汽车),Sportscar(赛车),Vehicle(车辆),第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,派生类定义方式 class base public: protected: private: ; public class derivedName: protected base private,public、protected 和 private分别表示公有继承、保护继承和私有继承,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,例1 基类车辆vehicle.h (因篇幅所限,我们 将类的实现放到头文件之中),#include class vehicle public: private: ;,vehicle(int aw, int ats, float ap) :weight(aw),topspeed(ats),price(ap) void print( ) cout “n weight:“ weight “pds“; cout “n top speed:“ topspeed “mph“; cout “n price: $ “ price;,int weight; /重量 int topspeed; /最高速度 float price; /价格,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/公有派生类汽车 car.h,#include “ vehicle.h“ class car : public vehicle public: private: ;,car(int aw, int ats, float ap, int anc, int ahp) :vehicle(aw,ats,ap), numbercylinders(anc) , horsepower(ahp) void print( ) vehicle:print( ); /调用基类的函数 cout “n cylinders:“ numbercylinders; cout “n horsepower:“ horsepower;,int numbercylinders; /汽缸数 int horsepower; /马力,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/应用程序 main.cpp,#include “ vehicle.h “ void main ( ) vehicle av(15000, 60, 300000); /创建对象 car ac(3500, 100, 12000, 6, 120);/创建对象 av.print( ); /调用基类函数 ac.print( ); /调用派生类函数 ,结果: weight: 15000 pds top speed: 60 mph price $300000.00 weight: 3500 pds top speed: 100 mph price $12000.00 cylinders: 6 horsepower: 120,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,例 1 有关内容总结,1. 在已有的类中加入新功能而创建的类称 为原有类的派生类。,2. 继承的方式有三种:公有、保护、私有。 一般为公有或保护,3. 继承类具有基类的所有成员,并可对已 有的成员进行重新定义。在派生类中访 问基类的函数用:表明,如在 car 中有: vehicle:print( );,4. 问题 派生类 的构造函数的定义? 派生类对基类的访问权限?,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,派生类与基类的构造函数,1。派生类的构造函数自动执行基类的构 造函数,且基类的构造函数先执行。,2。派生类的构造函数可不显式地写出基类 的构造函数,此时调用基类的无参数构 造函数,但若要传递参数,必须写出 如:car(int aw, int ats, float ap, int anc, int ahp) :vehicle(aw,ats,ap), numbercylinders(anc) , horsepower(ahp) 创建对象: vehicle av(15000, 60, 300000); car ac(3500, 100, 12000, 6, 120);,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,派生类对基类成员的访问规则,3. 外部访问:由友元、继承类函数等访问,访问有三种类型: 1. 内部访问:由类自己的函数访问,如前例 类vehicle 中的函数 print void print( ) cout “n weight:“ weight “pds“; cout “n top speed:“ topspeed “mph“; cout “n price: $ “ price; ,2. 类的对象访问:由类创建的对象访问。 vehicle av(15000, 60, 300000); /创建对象 av.print( ); /调用基类函数,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,公有派生类对基类成员的访问规则,1. 基类的私有数据。 内部访问 OK 对象访问 NON 外部访问 友元OK,继承类NON,2. 基类的保护数据。 内部访问 OK 对象访问 NON 外部访问 友元OK,继承类OK,3. 基类的公有数据。 内部访问 OK 对象访问 OK 外部访问 友元OK,继承类OK,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,例2. 类point 和 cercle,/save as point.h class point public: /公有成员 point( ); /缺省构造函数 point(float x1, float y1);/带参数构造函数 point( const point /点的纵坐标 ; /类定义结束,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/save as point.cpp #include “ point.h “ point:point( ) x=0; y=0; /缺省构造函数 point:point(float x1, float y1)/参数构造函数 x=x1; y=y1; point:point(const point ,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/继承类circle #include #include “point.h ” class circle:public point public: circle(float a, float b, float r): point(a,b) radius = r; void show( ) cout x “, “ y endl; point:show( ); cout “ radius= “ radius endl; ;,private: float radius;,/,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/save as main.cpp #include “ circle.h “ void main( ) circle c1(2, 2, 4); /调用参数构造函数 c1.show( ); /打印圆的半径和圆心 cout c1.radius; cout x; ,结果:Point(x,y)=(2,2) radius=4,/ 不能访问私有数据 / 不能访问私有数据,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,例 2 有关内容总结,1. 明确继承类构造函数与基类构造函数的 关系及实现。,2. 明确内部访问、对象访问与外部访问的权 限。特别是继承类对基类成员的访问。,3. 继承类具有基类的所有成员,并可对已 有的成员进行重新定义。在派生类中访 问基类的函数用:表明,如在 car 中有: point:show( );,4. 面向对象技术中的基本特征:类与继承 在C+中的实现,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,多重继承,问题的提出 单继承中,基类只有一个, 如果一个类由多个基类继承 而来,该任何定义?,teacher(教师),sudentr(学生),data_rec(信息记录),t_postgra(在职研究生),Postgra(研究生),例如学校人员分类的层次关系:,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,问题: teacher 和 student都是data_rec的继承类,它们都有基类的所有成员,即有一个基类成员的拷贝。t_postgra分别是teacher 和student的继承类,所以,它具有两者的一个拷贝,即有两个data_rec的拷贝=数据冗余,解决的办法:虚基类 对多继承的派生类,它将只保持一个基 类的成员拷贝,实现办法:在继承的基类前加关键字 virtual class devried:virtual baseClass.,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,例3:学校人员分类描述,有类 data_rec, teacher, student, postgra, tpost. 文件为univ.h,#include #include class data_rec public: data_rec( ) name=null; void insert_name( char *na) delete name; name=new charstrlen(na)+1; strcpy(name, na); void print ( ) cout “n name:“ name; private: char *name; ;,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/定义派生类 student class student:virtual public data_rec public: student( ):data_rec( ) id=0; /构造函数 void insert_id(int pid) id=pid; void print ( ) data_rec:print( ); /访问基类的函数 cout “n id=“ id; ,private: int id; ;,第5章 派生与继承性,5.1 派生类 5.2 多重继承 5.3 类模板的派生,/
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号