继承与多态性.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:
"<}
};