课件C++程序设计zw11_第1页
课件C++程序设计zw11_第2页
课件C++程序设计zw11_第3页
课件C++程序设计zw11_第4页
课件C++程序设计zw11_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+程序设计(第3版)第11章继承与派生11.1继承与派生的概念图11.1图11.2图11.3图11.4图11.511.2派生类的声明方式11.3派生类的构成图11.611.4派生类成员的访问属性11.4.1公用继承11.4.2私有继承表11.2私有基类在派生类中的访问属性图11.711.4.3保护成员和保护继承图11.811.4.4多级派生时的访问属性图11.911.5派生类的构造函数和析构函数11.5.1简单的派生类的构造函数编写程序:#include #include using namespace std;class Student/声明基类Student public: Student(int n,string nam,char s)/定义基类构造函数num=n;name=nam;sex=s; Student() /基类析构函数 protected: /保护部分int num;string name;char sex ; ;class Student1: public Student/声明公用派生类Student1 public: /派生类的公用部分Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) /定义派生类构造函数 age=a;/在函数体中只对派生类新增的数据成员初始化addr=ad;void show() coutnum: numendl;coutname: nameendl;coutsex: sexendl;coutage: ageendl;coutaddress: addrendlendl;Student1() /派生类析构函数private: /派生类的私有部分int age;string addr;int main() Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai);Student1 stud2(10011,Zhang-fang,m,21,213 Shanghai Road,Beijing);stud1.show();/输出第1个学生的数据stud2.show();/输出第2个学生的数据return 0;运行结果:num:10010name:Wang-lisex:faddress: 115 Beijing Road,Shanghainum:10011name:Zhang-fangsex:maddress: 213 Shanghai Road,Beijing图11.10图11.1111.5.2有子对象的派生类的构造函数编写程序:#include #include using namespace std;class Student/声明基类public:/公用部分 Student(int n, string nam) /基类构造函数,与例11.5相同num=n;name=nam; void display() /成员函数,输出基类数据成员coutnum:numendlname:nameendl;protected:/保护部分int num;string name;class Student1: public Student/声明公用派生类student1 public:Student1(int n, string nam,int n1, string nam1,int a, string ad):Student(n,nam),monitor(n1,nam1) /派生类构造函数 age=a; addr=ad;void show() coutThis student is:endl;display();/输出num和namecoutage: ageendl;/输出agecoutaddress: addrendlendl; /输出addrvoid show_monitor()/成员函数,输出子对象 coutendlClass monitor is:endl;monitor.display(); /调用基类成员函数private: /派生类的私有数据Student monitor;/定义子对象(班长)int age;string addr;int main() Student1 stud1(10010,Wang_li,10001,Li_sun,19,115 Beijing Road,Shanghai);stud1.show(); /输出学生的数据stud1.show_monitor();/输出子对象的数据return 0;运行结果: This student is:num: 10010name: Wang_liage: 19address:115 Beijing Road,Shanghai Class monitor is:num:10001name:Li_sun图11.1211.5.3多层派生时的构造函数编写程序:#include #includeusing namespace std;class Student/声明基类 public:/公用部分Student(int n, string nam)/基类构造函数 num=n;name=nam;void display() /输出基类数据成员 coutnum:numendl;coutname:nameendl;protected:/保护部分int num;/基类有两个数据成员string name;class Student1: public Student /声明公用派生类Student1 public:Student1(int n,char nam10,int a):Student(n,nam)/派生类构造函数 age=a; /在此处只对派生类新增的数据成员初始化void show() /输出num,name和age display(); /输出num和namecoutage: ageendl;private: /派生类的私有数据int age;/增加一个数据成员;class Student2:public Student1 /声明间接公用派生类student2 public: /下面是间接派生类构造函数Student2(int n, string nam,int a,int s):Student1(n,nam,a)score=s;void show_all()/输出全部数据成员 show();/输出num和name coutscore:scoreendl; /输出ageprivate:int score; /增加一个数据成员;int main() Student2 stud(10010,Li,17,89);stud.show_all();/输出学生的全部数据return 0;运行结果: num:10010name:Liage:17score:89图11.1311.5.4派生类构造函数的特殊形式11.5.5派生类的析构函数11.6多重继承11.6.1声明多重继承的方法11.6.2多重继承派生类的构造函数编写程序:#include #include using namespace std;class Teacher/声明类Teacher(教师)类 public:/公用部分 Teacher(string nam,int a, string t)/构造函数 name=nam;age=a;title=t; void display()/输出教师有关数据 coutname:nameendl;coutageageendl;couttitle:titleendl;protected: /保护部分string name;int age;string title;/职称;class Student/定义类Student(学生) public:Student(char nam,char s,float sco) strcpy(name1,nam);sex=s;score=sco;/构造函数void display1()/输出学生有关数据 coutname:name1endl;coutsex:sexendl;coutscore:scoreendl;protected: /保护部分string name1;char sex;float score;/成绩;class Graduate:public Teacher,public Student /声明多重继承的派生类Graduate public:Graduate(string nam,int a,char s, string t,float sco,float w):Teacher(nam,a,t),Student(nam,s,sco),wage(w) void show()/输出研究生的有关数据 coutname:nameendl;coutage:ageendl;coutsex:sexendl;coutscore:scoreendl;couttitle:titleendl;coutwages:wageendl;private:float wage;/津贴;int main() Graduate grad1(Wang_li,24,f,assistant,89.5,1200);grad1.show();return 0;运行结果: name: Wang_li age: 24sex:fscore: 89.5 title:; assistancewages: 120011.6.3多重继承引起的二义性问题图11.14图11.15图11.16图11.17图11.18图11. 19图11. 2011.6.4虚基类1. 虚基类的作用图11.21图11.22图11.23图11.24图11.25编写程序: #include #include using namespace std;/声明公共基类Personclass Person public:Person(string nam,char s,int a)/构造函数 name=nam;sex=s;age=a; protected:/保护成员string name;char sex;int age;/声明Person的直接派生类Teacherclass Teacher:virtual public Person/声明Person为公用继承的虚基类 public: Teacher(string nam,char s,int a, string t):Person(nam,s,a)/构造函数 title=t; protected: /保护成员string title;/职称 ;/声明Person的直接派生类Studentclass Student:virtual public Person/声明Person为公用继承的虚基类 public:Student(string nam,char s,int a,float sco)/构造函数:Person(nam,s,a),score(sco)/初始化表protected: /保护成员float score; /成绩 ;/声明多重继承的派生类Graduateclass Graduate:public Teacher,public Student /Teacher和Student为直接基类 public:Graduate(string nam,char s,int a, string t,float sco,float w)/构造函数:Person(nam,s,a),Teacher(nam,s,a,t),Student(nam,s,a,sco),wage(w)/初始化表void show() /输出研究生的有关数据 coutname:nameendl;coutage:ageendl;coutsex:sexendl;coutscore:scoreendl;couttitle:titleendl;coutwages:wageendl;private:float wage; /津贴;/主函数 int main() Graduate grad1(Wang_li,f,24,assistant,89.5,1200); grad1.show();return 0; 运行结果:name: Wang_li age:24sex:fscore:89.5title:assistant wages:120011.7基类与派生类的转换图11.26图11.27编写程序: #include #include using namespace std;class Student/声明Student类 public:Student(int, string,float); /声明构造函数void display(); /声明输出函数private:int num;string name;float score;StudentStudent(int n, string nam,float s)/定义构造函数 num=n;name=nam;score=s;void Studentdisplay() /定义输出函数 coutendlnum:numendl;coutname:nameendl;coutscore:scoreendl;class Graduate:public Student/声明公用派生类Graduate public:Graduate(int,string,float,float); /声明构造函数void display(); /声明输出函数private:float wage;/津贴;GraduateGraduate(int n, string nam,float s,float w):Student(n,nam,s),wage(w) /定义构造函数void Graduatedisplay() /定义输出函数 Studentdisplay();/调用Student类的display函数coutwage=wagedisplay(); /调用stud1.display函数pt=&grad1; /指针指向grad1pt-display(); /调用grad1.display函数return 0;运行结果:num:1001name:Liscore:87.5num:2001name:Wangscore:98.511.8继承与组合11.9继承在软件开发中的重要意义习题1. 将例11.1的程序片段补充和改写成一个完整、正确的程序,用公用继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。2. 将例11.2的程序片段补充和改写成一个完整、正确的程序,用私有继承方式。在程序中应包括输入数据的函数,在程序运行时输入num,name,sex,age,addr的值,程序应输出以上5个数据的值。3. 将例11.3的程序修改、补充,写成一个完整、正确的程序,用保护继承方式。在程序中应包括输入数据的函数。4. 修改例11.3的程序,改为用公用继承方式。上机调试程序,使之能正确运行并得到正确的结果。对这两种继承方式作比较分析,考虑在什么情况下二者不能互相代替。5. 有以下程序结构,请分析访问属性。(1) 在main函数中能否用b1.i,b1.j和b1.k引用派生类B对象b1中基类A的成员?(2) 派生类B中的成员函数能否调用基类A中的成员函数f1和f2?(3) 派生类B中的成员函数能否引用基类A中的数据成员i,j,k?(4) 能否在main函数中用c1.i,c1.j,c1.k,c1.m,c1.n,c1.p引用基类A的成员i,j,k,派生类B的成员m,n,以及派生类C的成员p?(5) 能否在main函数中用c1.f1(),c1.f2(),c1.f3()和c1.f4()调用f1,f2

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论