继承与多态性.doc
学生实验报告开课实验室: 2011 年 4 月 16 日学院年级、专业、班姓名学号实验课程名称面向对象程序设计成绩实验项目名称继承与多态性指导老师一、 实验目的1、掌握继承、基类和派生类的概念。2、掌握初始化基类成员的方法。3、 掌握派生类对基类的继承。4、 学习虚函数和纯虚函数的定义与使用方式。5、 理解抽象类的概念,学习如何用指针指向其他的派生类,实现多态性。6、 掌握抽象类的定义与使用方式,并注意指针的用法。7、学习如何使用虚函数、纯虚函数、抽象类和实现类的多态性。二、实验设备 1、硬件环境:微型计算机,2、软件环境:Visual C+ 6.0;三、实验要求 1、定义派生类的实例#include "stdafx.h"#include "string.h"#include "iostream.h"class STUDENTprotected:char m_no12,m_name11;int m_sex,m_year,m_month,m_day;public:STUDENT() void set(char * no,char * name,int sex,int year,int month,int day)strcpy(m_no,no);strcpy(m_name,name);m_sex=sex;m_year=year;m_month=month;m_day=day;void set_no(char * no)strcpy(m_no,no);void set_name(char * name)strcpy(m_name,name);void set_sex(int sex)m_sex=sex;void set_year(int year)m_year=year;void set_month(int month)m_month=month;void set_day(int day)m_day=day;char * get_no()return m_no;char * get_name()return m_name;int get_sex()return m_sex;int get_year()return m_year;int get_month()return m_month;int get_day()return m_day;class CLASS: public STUDENTprotected:int m_c,m_english;public:CLASS()void set_c(int c)m_c=c;void set_english(int english)m_english=english;int get_c()return m_c;int get_english()return m_english;void list()cout<<"n学号:"<<m_no;cout<<"n姓名:"<<m_name;cout<<"n性别:"<<( (m_sex=0) ? "女" : "男");cout<<"n出生日期:"<<m_year<<"年"<<m_month<<"月"<<m_day<<"日"cout<<"nC+:"<<m_c;cout<<"n英语:"<<m_english;int main(int argc, char* argv)char str100;int x,i;CLASS s10;for (i=0;i<=1;i+)cout<<"nn请输入学生的学号:"cin>>str;si.set_no(str);cout<<" 姓名:"cin>>str;si.set_name(str);cout<<" 性别:"cin>>x;si.set_sex(x);cout<<" 出生日期:"cin>>x;si.set_year(x);cin>>x;si.set_month(x);cin>>x;si.set_day(x);cout<<" C+:"cin>>x;si.set_c(x);cout<<" 英语:"cin>>x;si.set_english(x);for (i=0;i<=1;i+)si.list();cout<<"nn"return 0;2、多重继承的实例#include "stdafx.h"#include "iostream.h"class BASE1public:void show_i()cout<<i<<"n"protected:int i;class BASE2public:void show_j()cout<<j<<"n"protected:int j;class DERIVED : publicBASE1,public BASE2public:void set(int x,int y)i=x;j=y;int main(int argc, char* argv)DERIVED obj;obj.set(5,7);obj.show_i();obj.show_j();return 0; 3、有一个图书馆类,内有数据成员“借书卡号”和“书名”;还有一个学生类,内有数据成员“姓名”。试设计一个读者类,它是图书馆类和学生类的派生类,继承了它们的所有数据成员和成员函数,在此基础上要添加一个查找函数,可根据输入的读者姓名,显示出该读者的相关信息。 程序设计: (1)定义一个图书馆类Library,其主要功能是记录读者的借书卡号和书名。 (2)定义一个学生类Student,它的主要作用是记录读者的姓名。 (3)定义一个通过读者类Reader,它是Library和Student的派生类,它除了继承这两个类的数据成员,还定义自己的数据成员,通过该类可以了解到读者的上述所有信息,还记录了读者的借还书日期。3个类的关系如图所示。Library 类Student类Char CardChar BookChar Namevoid SetLib()void DispLib()void SetStu()void DispStu()Reader类Char databuf(9)Int Date1(3)Int date2(3)Void SstBor()Int Find()Void Display()4、虚函数的简单使用。# include <iostream.h > class base public:virtual void fh() cout « "In base class n " ; ;class subclass: public base public:virtual void fn() cout « "In subclass n " ; ;void test( base &b) b.fn(); void main( ) base be;subclass sc;cout« " Calling test(bc) n " ;test(bc);cout« "Calling test(sc) n " ;test(sc);5、用抽象类实现的菜单程序。 # include < iostream. h > class Menu public:virtual void action ( ) = 0;;class item1: public Menupublic:virtual void action ()cout« "新建文件" «endl;;class item2: public Menupublic :virtual void action ( )cout« "打开文件 " «endl;;class item3: public Menupublic:virtual void action ( )cout« "保存文件" «endl;;class item4: public Menupublic:virtual void action() cout«关闭文件" «endl;void main() int select;Menu * Fptr4;FptrO = new item1;Fptr1 = new item2;Fptr2 = new item3;Fptr3 = new item4;Do cout« " 1 new file " « endl;cout« " 2 open file " « endl;cout« " 3 save file " « endl;cout« "4 close file " « endl;cout« "O exit " «endl;cin select;if( select > = 1 && select < = 4) Fptrselect-1->action();while( select! =0);for(int i=0;i<=3;i+ )delete Fptri;6、定义一个从正方形、球体和圆柱体的各种运算中抽象出一个公共基 container类,在其中定义表面积和体积的纯虚函数,在抽象类中定义一个公共的成员数据radius,此数据可作为球体的半径,正方形的边长,圆柱体的底面的半径。分析:定义一个派生于container类的正方体类cube,在类中都具有求表面积的和体积的重定义的成员函数。定义一个派生于container类的球体类sphere,在类中都具有求表面积和体积的重定义的成员函数。定义一个派生于container类的圆柱体类cylinder,在类中都具有求表面积和体积的重定义的成员函数。7、编写一个人员信息管理系统。这个系统的功能是:交互式的实现校园人员信息的录入与显示。分析:学校里,主要有四类人员:大学本科学生、教师、研究生和助教。大学本科生每周有固定的学时数。教师除了固定的学时数外,还有每周的教学时数。研究生除了固定的学时数外,每周还可以自由做一定的研究。助教生除了上课外,还要做研究和一定的教学工作。人员的基本信息包括姓名、编号、性别、身份证号、总学时数以及每周固定学时数。各个人员之间的关系: people类派生出student 类和teacher类,student 类派生出graduate类, graduate类和teacher类派生出TA类。以下给出部分程序:#include < iostream. h >class people public:/添加程序private:;class student: virtual public peoplepublic:/添加程序private:;class teacher:virtual public peoplepublic:/添加程序private:;class graduate: virtual public studentpublic:/添加程序private:;class TA:public people student, public teacherpublic:/添加程序private:;void main()/添加程序四、思考问题及课后练习1、编写一个程序,定义一个汽车类vehicle,它具有一个需传递参数的构造函数,类中的数据成员包括车轮个数和车的重量,并放到保护段中;定义轿车类car是汽车类vehicle的私有派生类,其中包含载人数;再定义卡车类truck是汽车类vehicle的私有派生类,其中包含载人数和载重量。每个类都有相应的数据输出。2、设有系类,它的数据包括系编号、系名,功能包括置数据、修改数据和取数据。设有班类,它继承系类,另数据包括学号、姓名、性别,功能包括置数据、修改数据和取数据。主函数默认设置一位同学数据,键盘输入一位同学数据,然后显示二位同学数据。四、实验程序Sy3_3:#include <iostream>#include <cstring>#include <ctime>using namespace std;class Libraryprotected:char card15;char book20;public:void setlib();void displib();class Studentprotected:char name20;public:void setstu();void dispstu();class Reader: public Library,Studentprotected:char datebuf9;int date13;int date23;public:Reader();void setbor();int find(char *n);void display();void Library:setlib()cout<<"输º?入¨?卡¡§号?:"<<endl;cin>>card;cout<<"输º?入¨?书º¨¦名?"<<endl;cin>>book;void Library:displib()cout<<"借¨¨书º¨¦卡¡§号?: "<<card<<endl;cout<<"书º¨¦名?: "<<book<<endl;void Student:setstu()cout<<"输º?入¨?姓?名?: "<<endl;cin>>name;void Student:dispstu()cout<<"姓?名?: "<<name<<endl;void Reader:setbor()setlib();setstu();void Reader:display()dispstu();displib();int Reader:find(char *n)if (strcmp(name,n)=0)return 1;elsereturn 0;Reader:Reader()_strdate(datebuf);/时º¡À间?格?式º?是º?:êo例¤y09/01/08 date10=(datebuf6-'0')*10+(datebuf7-'0')+2000; date11=(datebuf0-'0')*10+(datebuf1-'0'); date12=(datebuf3-'0')*10+(datebuf4-'0'); /*计?算?Date2*/ date22=date12; if(date11+2>12) date21=(date11+2)%12; date20=date10+1; else date20=date10; date21=date11+2; int main()Reader *p;int m,i,j=0;char name20;cout<<"请?输º?入¨?人¨?数ºy: "<<endl;cin>>m;p=new Readerm;for (i=0;i<m;i+)cout<<"第̨²"<<i+1<<"个?读¨¢者?的Ì?借¨¨书º¨¦证¡è: "<<endl;pi.setbor();for (i=0;i<m;i+)cout<<"第̨²"<<i+1<<"个?读¨¢者?的Ì?信?息¡é: "<<endl;pi.display();cout<<"请?输º?入¨?要°a查¨¦找¨°的Ì?读¨¢者?的Ì?姓?名?"<<endl;cin>>name;for (i=0;i<m;i+)if(pi.find(name)pi.display();j=1;break;if(j=0)cout<<"查¨¦找¨°的Ì?姓?名?不?存ä?在¨²"<<endl;Sy3_6:#include <iostream>using namespace std;#define PI 3.14class container /基¨´类¤¨¤public:double radius;virtual void squir()=0;virtual void volume()=0;class cube:public container /正y方¤?体¬?类¤¨¤public:cube(double a1=0) radius=a1;void squir()double a2;a2=radius*radius*6;cout<<"正y方¤?体¬?的Ì?表À¨ª面?积y为a: "<<a2<<endl;void volume()double a3;a3=radius*radius*radius;cout<<"正y方¤?体¬?的Ì?体¬?积y为a: "<<a3<<endl;class sphere:public container /球¨°类¤¨¤public:sphere(double b1=0)radius=b1;void squir()double b2;b2=4*radius*radius*PI;cout<<"球¨°的Ì?表À¨ª面?积y为a: "<<b2<<endl;void volume()double b3;b3=4/3*radius*radius*radius*PI;cout<<"球¨°的Ì?体¬?积y为a: "<<b3<<endl;class cylinder:public container /圆2柱¨´体¬?类¤¨¤private:double h;public:cylinder(double c1=0,double h1=0)radius=c1;h=h1; void squir()double c2;c2=2*PI*radius*radius+2*PI*radius*h;cout<<"圆2柱¨´体¬?的Ì?表À¨ª面?积y为a: "<<c2<<endl;void volume()double c3;c3=PI*radius*radius*h;cout<<"圆2柱¨´体¬?的Ì?体¬?积y为a: "<<c3<<endl;int main()cube c(6);cout<<"正y方¤?体¬?的Ì?边À?长¡èl=6"<<endl;c.squir();c.volume();cout<<endl;sphere s(2);cout<<"球¨°体¬?的Ì?半ã?径?r=2"<<endl;s.squir();s.volume();cout<<endl;cylinder y(2,4);cout<<"圆2柱¨´体¬?的Ì?底Ì¡Á边À?半ã?径?r=2,高?h=4"<<endl;y.squir();y.volume();Sy3_7:#include < iostream >#include <cstring>using namespace std;class people public:char name20;int num;char sex20;int totaltime;int weektime;int iden;/*people(char *na,int n,char *s,int week)strcpy(name,na);num=n;strcpy(sex,s);weektime=week;*/void get()cout<<"输º?入¨?姓?名?: "cin>>name;cout<<"输º?入¨?编À¨¤号?: "cin>>num;cout<<"输º?入¨?性?别Àe: "cin>>sex;cout<<"输º?入¨?身¦¨ª份¤Y证¡è号?: "cin>>iden;cout<<"输º?入¨?每?周¨¹固¨¬定¡§学¡ì时º¡À: "cin>>weektime;void show()cout<<"姓?名?为a:"<<name<<endl;cout<<"编À¨¤号?为a:"<<num<<endl;cout<<"性?别Àe:"<<sex<<endl;cout<<"身¦¨ª份¤Y证¡è号?为a:"<<iden<<endl;cout<<"总Á¨¹学¡ì时º¡À数ºy为a:"<<totaltime<<endl;class student: virtual public peoplepublic:void get()people:get();cout<<endl;void show()people:show();protected:;class teacher:virtual public peoplepublic:void get()people:get();cout<<"输º?入¨?教¨¬学¡ì时º¡À数ºy: "cin>>ttime;totaltime=weektime+ttime;cout<<endl;void show()people:show();protected:int ttime;class graduate: virtual public studentpublic:void get()student:get();cout<<"输º?入¨?研D究?时º¡À数ºy: "cin>>gtime;totaltime=weektime+gtime;cout<<endl;protected:int gtime;class TA: public student, public teacherpublic:void get()people:get();cout<<"输º?入¨?教¨¬学¡ì时º¡À数ºy: "cin>>ttime;cout<<"输º?入¨?研D究?时º¡À数ºy: "cin>>gtime;totaltime=weektime+ttime+gtime;cout<<endl;void show()people:show();protected:int gtime;void main()student stu;teacher tea;graduate gra;TA ta;int r,i;cout<<"输º?入¨?你?的Ì?类¤¨¤型¨ª: 1.本À?科?生¦¨² 2.教¨¬师º| 3.研D究?所¨´ 4.助¨²教¨¬"<<endl;cin>>r;switch(r)case 1:stu.get();stu.show();break;case 2:tea.get();tea.show();break;case 3:gra.get();gra.show();break;case 4:ta.get();ta.show();break;Sy3_4_1:#include <iostream>using namespace std;class vehiclepublic:vehicle(int x,double y)wheelnum=x;weight=y;void print()cout<<"vehicle: "<<endl;cout<<"车¦Ì轮?个?数ºy: "<<wheelnum<<endl;cout<<"车¦Ì的Ì?重?量¢?: "<<weight<<endl;protected:int wheelnum;double weight;class car:private vehicleprivate:int loadnum;public:car(int x,double y,int load):vehicle(x,y)loadnum=load;void print()cout<<"car: "<<endl;vehicle:print();cout<<"载?人¨?数ºy: "<<loadnum<<endl;class truck:private vehicleprivate:int loadnum;double loadwei;public:truck(int x,double y,int load,double loadw):vehicle(x,y)loadnum=load;loadwei=loadw;void print()cout<<"truck: "<<endl;vehicle:print();cout<<"载?人¨?数ºy: "<<loadnum<<endl;cout<<"载?重?量¢?: "<<loadwei<<endl;int main()car a(4,40,6);a.print();cout<<endl;truck b(6,60,8,30);b.print();Sy3_4_2:#include <iostream>#include <cstring>using namespace std;class departmentprotected:int dnum;char dname20;public:void setdata(char *i,int j)dnum=j;strcpy(dname,i);void redata(char *i,int j)dnum=j;strcpy(dname,i);void getdata(char *i,int j)dnum=j;strcpy(dname,i);class team:public departmentprotected:int num;char name20;char sex20;public:void setdata(char *i,int j,int n,char *na,char *s)department:setdata(i,j);num=n;strcpy(name,na);strcpy(sex,s);void redata(char *i,int j,int n,char *na,char *s)department:setdata(i,j);num=n;strcpy(name,na);strcpy(sex,s);void getdata(char *i,int j,int n,char *na,char *s)department:setdata(i,j);num=n;strcpy(name,na);strcpy(sex,s);void show() cout<<"编À¨¤号?: "<<dnum<<endl;cout<<"系¦Ì名?: "<<dname<<endl;cout<<"学¡ì号?: "<<num<<endl;cout<<"姓?名?: "<<name<<endl;cout<<"性?别Àe: "<<sex<<endl; ;int main()int num,dnum;char dname20,name20,sex20;team a1;team a2;a1.setdata("计?算?机¨²系¦Ì",100,10061,"小?明¡Â","男D"); cout<<"请?输º?入¨?第̨²二t名?同ª?学¡ì的Ì?信?息¡é"<<endl; cout<<"编À¨¤号?:" cin>>dnum; cout<<"系¦Ì名?:" cin>>dname; cout<<"学¡ì号?:" cin>>num; cout<<"姓?名?:" cin>>name; cout<<"性?别Àe:" cin>>sex; a2.setdata(dname,dnum,num,name,sex); cout<<endl<<"主¡Â函¡¥数ºy自Á?己o生¦¨²成¨¦的Ì?同ª?学¡ì信?息¡é:êo"<<endl;a1.show();cout<<endl<<"录?入¨?的Ì?第̨²二t名?同ª?学¡ì的Ì?信?息¡é:êo"<<endl; a2.show();实验运行结果:Sy3_3:Sy3_6:Sy3_7:Sy3_4_1:Sy3_4_2: