继承与多态性.docx
- 文档编号:23817313
- 上传时间:2023-05-21
- 格式:DOCX
- 页数:31
- 大小:69.98KB
继承与多态性.docx
《继承与多态性.docx》由会员分享,可在线阅读,更多相关《继承与多态性.docx(31页珍藏版)》请在冰豆网上搜索。
继承与多态性
学生实验报告
开课实验室:
2011年4月16日
学院
年级、专业、班
姓名
学号
实验课程名称
面向对象程序设计
成绩
实验项目名称
继承与多态性
指导老师
一、实验目的
1、掌握继承、基类和派生类的概念。
2、掌握初始化基类成员的方法。
3、掌握派生类对基类的继承。
4、学习虚函数和纯虚函数的定义与使用方式。
5、理解抽象类的概念,学习如何用指针指向其他的派生类,实现多态性。
6、掌握抽象类的定义与使用方式,并注意指针的用法。
7、学习如何使用虚函数、纯虚函数、抽象类和实现类的多态性。
二、实验设备
1、硬件环境:
微型计算机,2、软件环境:
VisualC++6.0;
三、实验要求
1、定义派生类的实例
#include"stdafx.h"
#include"string.h"
#include"iostream.h"
classSTUDENT
{protected:
charm_no[12],m_name[11];
intm_sex,m_year,m_month,m_day;
public:
STUDENT(){}
voidset(char*no,char*name,intsex,intyear,intmonth,intday)
{strcpy(m_no,no);
strcpy(m_name,name);
m_sex=sex;
m_year=year;
m_month=month;
m_day=day;
}
voidset_no(char*no)
{strcpy(m_no,no);}
voidset_name(char*name)
{strcpy(m_name,name);}
voidset_sex(intsex)
{m_sex=sex;}
voidset_year(intyear)
{m_year=year;}
voidset_month(intmonth)
{m_month=month;}
voidset_day(intday)
{m_day=day;}
char*get_no()
{returnm_no;}
char*get_name()
{returnm_name;}
intget_sex()
{returnm_sex;}
intget_year()
{returnm_year;}
intget_month()
{returnm_month;}
intget_day()
{returnm_day;}
};
classCLASS:
publicSTUDENT
{protected:
intm_c,m_english;
public:
CLASS(){}
voidset_c(intc)
{m_c=c;}
voidset_english(intenglish)
{m_english=english;}
intget_c()
{returnm_c;}
intget_english()
{returnm_english;}
voidlist()
{cout<<"\n学号:
"< cout<<"\n姓名: "< cout<<"\n性别: "<<((m_sex==0)? "女": "男"); cout<<"\n出生日期: "< cout<<"\nC++: "< cout<<"\n英语: "< } }; intmain(intargc,char*argv[]) { charstr[100]; intx,i; CLASSs[10]; for(i=0;i<=1;i++) {cout<<"\n\n请输入学生的学号: "; cin>>str; s[i].set_no(str); cout<<"姓名: "; cin>>str; s[i].set_name(str); cout<<"性别: "; cin>>x; s[i].set_sex(x); cout<<"出生日期: "; cin>>x; s[i].set_year(x); cin>>x; s[i].set_month(x); cin>>x; s[i].set_day(x); cout<<"C++: "; cin>>x; s[i].set_c(x); cout<<"英语: "; cin>>x; s[i].set_english(x); } for(i=0;i<=1;i++) s[i].list(); cout<<"\n\n"; return0; } 2、多重继承的实例 #include"stdafx.h" #include"iostream.h" classBASE1 {public: voidshow_i() {cout< protected: inti; }; classBASE2 {public: voidshow_j() {cout< protected: intj; }; classDERIVED: publicBASE1,publicBASE2 {public: voidset(intx,inty) {i=x;j=y;} }; intmain(intargc,char*argv[]) {DERIVEDobj; obj.set(5,7); obj.show_i(); obj.show_j(); return0; } 3、有一个图书馆类,内有数据成员“借书卡号”和“书名”;还有一个学生类,内有数据成员“姓名”。 试设计一个读者类,它是图书馆类和学生类的派生类,继承了它们的所有数据成员和成员函数,在此基础上要添加一个查找函数,可根据输入的读者姓名,显示出该读者的相关信息。 程序设计: (1)定义一个图书馆类Library,其主要功能是记录读者的借书卡号和书名。 (2)定义一个学生类Student,它的主要作用是记录读者的姓名。 (3)定义一个通过读者类Reader,它是Library和Student的派生类,它除了继承这两个类的数据成员,还定义自己的数据成员,通过该类可以了解到读者的上述所有信息,还记录了读者的借还书日期。 3个类的关系如图所示。 Library类 Student类 CharCard CharBook CharName voidSetLib() voidDispLib() voidSetStu() voidDispStu() Reader类 Chardatabuf(9) IntDate1(3) Intdate2(3) VoidSstBor() IntFind() VoidDisplay() 4、虚函数的简单使用。 #include classbase {public: virtualvoidfh(){cout«"Inbaseclass\n";} }; classsubclass: publicbase {public: virtualvoidfn(){cout«"Insubclass\n";} }; voidtest(base&b) {b.fn();} voidmain() {basebe; subclasssc; cout«"Callingtest(bc)\n"; test(bc); cout«"Callingtest(sc)\n"; test(sc); } 5、用抽象类实现的菜单程序。 #include classMenu {public: virtualvoidaction()=0; }; classitem1: publicMenu {public: virtualvoidaction() {cout«"新建文件"«endl;} }; classitem2: publicMenu {public: virtualvoidaction() {cout«"打开文件"«endl;} }; classitem3: publicMenu {public: virtualvoidaction() {cout«"保存文件"«endl;} }; classitem4: publicMenu {public: virtualvoidaction() {cout«关闭文件"«endl;} }; voidmain() {intselect; Menu*Fptr[4]; Fptr[O]=newitem1; Fptr[1]=newitem2; Fptr[2]=newitem3; Fptr[3]=newitem4; Do {cout«"1newfile"«endl; cout«"2openfile"«endl; cout«"3savefile"«endl; cout«"4closefile"«endl; cout«"Oexit"«endl; cin》select; if(select>=1&&select<=4)Fptr[select-1]->action(); }while(select! =0); for(inti=0;i<=3;i++) {deleteFptr[i];} 6、定义一个从正方形、球体和圆柱体的各种运算中抽象出一个公共基container类,在其中定义表面积和体积的纯虚函数,在抽象类中定义一个公共的成员数据radius,此数据可作为球体的半径,正方形的边长,圆柱体的底面的半径。 分析: 定义一个派生于container类的正方体类cube,在类中都具有求表面积的和体积的重定义的成员函数。 定义一个派生于container类的球体类sphere,在类中都具有求表面积和体积的重定义的成员函数。 定义一个派生于container类的圆柱体类cylinder,在类中都具有求表面积和体积的重定义的成员函数。 7、编写一个人员信息管理系统。 这个系统的功能是: 交互式的实现校园人员信息的录入与显示。 分析: 学校里,主要有四类人员: 大学本科学生、教师、研究生和助教。 大学本科生每周有固定的学时数。 教师除了固定的学时数外,还有每周的教学时数。 研究生除了固定的学时数外,每周还可以自由做一定的研究。 助教生除了上课外,还要做研究和一定的教学工作。 人员的基本信息包括姓名、编号、性别、身份证号、总学时数以及每周固定学时数。 各个人员之间的关系: people类派生出student类和teacher类,student类派生出graduate类,graduate类和teacher类派生出TA类。 以下给出部分程序: #include classpeople {public: //添加程序 private: }; classstudent: virtualpublicpeople {public: //添加程序 private: }; classteacher: virtualpublicpeople {public: //添加程序 private: }; classgraduate: virtualpublicstudent {public: //添加程序 private: }; classTA: publicpeoplestudent,publicteacher {public: //添加程序 private: }; voidmain() {//添加程序} 四、思考问题及课后练习 1、编写一个程序,定义一个汽车类vehicle,它具有一个需传递参数的构造函数,类中的数据成员包括车轮个数和车的重量,并放到保护段中;定义轿车类car是汽车类vehicle的私有派生类,其中包含载人数;再定义卡车类truck是汽车类vehicle的私有派生类,其中包含载人数和载重量。 每个类都有相应的数据输出。 2、设有系类,它的数据包括系编号、系名,功能包括置数据、修改数据和取数据。 设有班类,它继承系类,另数据包括学号、姓名、性别,功能包括置数据、修改数据和取数据。 主函数默认设置一位同学数据,键盘输入一位同学数据,然后显示二位同学数据。 四、实验程序 Sy3_3: #include #include #include usingnamespacestd; classLibrary {protected: charcard[15]; charbook[20]; public: voidsetlib(); voiddisplib(); }; classStudent {protected: charname[20]; public: voidsetstu(); voiddispstu(); }; classReader: publicLibrary,Student {protected: chardatebuf[9]; intdate1[3]; intdate2[3]; public: Reader(); voidsetbor(); intfind(char*n); voiddisplay(); }; voidLibrary: : setlib() { cout<<"输º? 入¨? 卡¡§号? : "< cin>>card; cout<<"输º? 入¨? 书º¨¦名? "< cin>>book; } voidLibrary: : displib() { cout<<"借¨¨书º¨¦卡¡§号? : "< cout<<"书º¨¦名? : "< } voidStudent: : setstu() { cout<<"输º? 入¨? 姓? 名? : "< cin>>name; } voidStudent: : dispstu() { cout<<"姓? 名? : "< } voidReader: : setbor() { setlib(); setstu(); } voidReader: : display() { dispstu(); displib(); } intReader: : find(char*n) { if(strcmp(name,n)==0) return1; else return0; } Reader: : Reader() { _strdate(datebuf);//时º¡À间? 格? 式º? 是º? : êo例¤y09/01/08 date1[0]=(datebuf[6]-'0')*10+(datebuf[7]-'0')+2000; date1[1]=(datebuf[0]-'0')*10+(datebuf[1]-'0'); date1[2]=(datebuf[3]-'0')*10+(datebuf[4]-'0'); /*计? 算? Date2*/ date2[2]=date1[2]; if(date1[1]+2>12) { date2[1]=(date1[1]+2)%12; date2[0]=date1[0]+1; } else { date2[0]=date1[0]; date2[1]=date1[1]+2; } } intmain() { Reader*p; intm,i,j=0; charname[20]; cout<<"请? 输º? 入¨? 人¨? 数ºy: "< cin>>m; p=newReader[m]; for(i=0;i { cout<<"第̨²"< 读¨¢者? 的Ì? 借¨¨书º¨¦证¡è: "< p[i].setbor(); } for(i=0;i { cout<<"第̨²"< 读¨¢者? 的Ì? 信? 息¡é: "< p[i].display(); } cout<<"请? 输º? 入¨? 要°a查¨¦找¨°的Ì? 读¨¢者? 的Ì? 姓? 名? "< cin>>name; for(i=0;i { if(p[i].find(name)) { p[i].display(); j=1; break; } } if(j==0) cout<<"查¨¦找¨°的Ì? 姓? 名? 不? 存ä? 在¨²"< } Sy3_6: #include usingnamespacestd; #definePI3.14 classcontainer//基¨´类¤¨¤ { public: doubleradius; virtualvoidsquir()=0; virtualvoidvolume()=0; }; classcube: publiccontainer//正y方¤? 体¬? 类¤¨¤ { public: cube(doublea1=0) {radius=a1;} voidsquir() { doublea2; a2=radius*radius*6; cout<<"正y方¤? 体¬? 的Ì? 表À¨ª面? 积y为a: "< } voidvolume() { doublea3; a3=radius*radius*radius; cout<<"正y方¤? 体¬? 的Ì? 体¬? 积y为a: "< } }; classsphere: publiccontainer//球¨°类¤¨¤ { public: sphere(doubleb1=0) {radius=b1;} voidsquir() { doubleb2; b2=4*radius*radius*PI; cout<<"球¨°的Ì? 表À¨ª面? 积y为a: "< } voidvolume() { doubleb3; b3=4/3*radius*radius*radius*PI; cout<<"球¨°的Ì? 体¬? 积y为a: "< } }; classcylinder: publiccontainer//圆2柱¨´体¬? 类¤¨¤ { private: doubleh; public: cylinder(doublec1=0,doubleh1=0) {radius=c1;h=h1;} voidsquir() { doublec2; c2=2*PI*radius*radius+2*PI*radius*h; cout<<"圆2柱¨´体¬? 的Ì? 表À¨ª面? 积y为a: "< } voidvolume() { doublec3; c3=PI*radius*radius*h; cout<<"圆2柱¨´体¬? 的Ì? 体¬? 积y为a: "< } }; intmain() { cubec(6); cout<<"正y方¤? 体¬? 的Ì? 边À? 长¡èl=6"< c.squir(); c.volume(); cout< spheres (2); cout<<"球¨°体¬? 的Ì? 半ã? 径? r=2"< s.squir(); s.volume(); cout< cylindery(2,4); cout<<"圆2柱¨´体¬? 的Ì? 底Ì¡Á边À? 半ã? 径? r=2,高? h=4"< y.squir(); y.volume(); } Sy3_7: #include #include usingnamespacestd; classpeople {public: charname[20]; intnum; charsex[20]; inttotaltime; intweektime; intiden; /*people(char*na,intn,char*s,intweek) { strcpy(name,na); num=n; strcpy(sex,s); weektime=week; }*/ voidget() { cout<<"输º? 入¨? 姓? 名? : "; cin>>name; cout<<"输º? 入¨? 编À¨¤号? : "; cin>>num; cout<<"输º? 入¨? 性? 别Àe: "; cin>>sex; cout<<"输º? 入¨? 身¦¨ª份¤Y证¡è号? : "; cin>>iden; cout<<"输º? 入¨? 每? 周¨¹固¨¬定¡§学¡ì时º¡À: "; cin>>weektime; } voidshow() { cout<<"姓? 名? 为a: "< cout<<"编À¨¤号? 为a: "< cout<<"性? 别Àe: "< cout<<"身¦¨ª份¤Y证¡è号? 为a: "< cout<<"总Á¨¹学¡ì时º¡À数ºy为a: "< } };
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 继承 多态性
![提示](https://static.bdocx.com/images/bang_tan.gif)