多态练习题.docx
《多态练习题.docx》由会员分享,可在线阅读,更多相关《多态练习题.docx(15页珍藏版)》请在冰豆网上搜索。
多态练习题
1、生成表示学生的类XS,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄,并将他们全部定义为纯虚函数;生成CZS类表示初中生,包含数据成员xm、xb和nl表示学生的姓名、性别和年龄,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄;再生成类GZS表示高中生和类DXS表示大学生,同样包含相同含义的数据成员xm、xb和nl,也包括成员函数dispXM()、dispXB()和dispNL()。
要求:
(1)设计和实现基本类XS
(2)设计和实现派生类CZS,GZS和DXS
(3)分别生成CZS、GZS、DXS类对象
(4)将CZS、GZS、DXS类对象的指针赋给指针赋给XS类的指针变量。
(5)分别用XS类的指针和引用访问dispXM()、dispXB()和dispNL()函数。
(6)观察程序结果。
#include
#include
usingnamespacestd;
classXS{
public:
virtualvoiddispXM()=0;
virtualvoiddispXB()=0;
virtualvoiddispNL()=0;
};
classCZS:
publicXS{
public:
CZS(char*m="张三",intb=1,intn=14);
voiddispXM();
voiddispXB();
voiddispNL();
protected:
charxm[9];
intxb,nl;
};
CZS:
:
CZS(char*m,intb,intn)
{
strcpy(xm,m);
xb=b,nl=n;
}
voidCZS:
:
dispXM()
{
cout<<"name:
"<}
voidCZS:
:
dispXB()
{
if(xb==1)
cout<<"Man"<if(xb==0)
cout<<"Woman"<}
voidCZS:
:
dispNL()
{
cout<<"age:
"<}
classGZS:
publicXS{
public:
GZS(char*m="张三",intb=1,intn=17);
voiddispXM();
voiddispXB();
voiddispNL();
protected:
charxm[9];
intxb,nl;
};
GZS:
:
GZS(char*m,intb,intn)
{
strcpy(xm,m);
xb=b,nl=n;
}
voidGZS:
:
dispXM()
{
cout<<"name:
"<}
voidGZS:
:
dispXB()
{
if(xb==1)
cout<<"Man"<if(xb==0)
cout<<"Woman"<}
voidGZS:
:
dispNL()
{
cout<<"age:
"<}
classDXS:
publicXS{
public:
DXS(char*m="张三",intb=1,intn=20);
voiddispXM();
voiddispXB();
voiddispNL();
protected:
charxm[9];
intxb,nl;
};
DXS:
:
DXS(char*m,intb,intn)
{
strcpy(xm,m);
xb=b,nl=n;
}
voidDXS:
:
dispXM()
{
cout<<"name:
"<}
voidDXS:
:
dispXB()
{
if(xb==1)
cout<<"Man"<if(xb==0)
cout<<"Woman"<}
voidDXS:
:
dispNL()
{
cout<<"age:
"<}
voiddisplayP(XS*p)
{
p->dispXM();
p->dispXB();
p->dispNL();
}
voiddisplayR(XS&p)
{
p.dispXM();
p.dispXB();
p.dispNL();
}
voidmain()
{
CZSczs("赵一",1,12);
GZSgzs("钱二",0,15);
DXSdxs("孙三",1,18);
XS*p;//定义抽象基类的指针变量p
p=&czs;//将初中生对象czs的地址赋给p
displayP(p);
p=&gzs;//将高中生对象czs的地址赋给p
displayP(p);
p=&dxs;//将大学生对象czs的地址赋给p
displayP(p);
cout<<"\n----------------------------------------\n";
XS&r1=czs;//定义抽象基类的引用变量r1为czs的别名
displayR(r1);
XS&r2=gzs;//定义抽象基类的引用变量r2为czs的别名
displayR(r2);
XS&r3=dxs;//定义抽象基类的引用变量r3为czs的别名
displayR(r3);
cout<<"\n----------------------------------------\n";
}
2、某小型公司主要有3类人员:
经理、兼职技术人员、兼职销售员。
这些人员分别具有以下属性。
经理:
姓名、编号、固定工资、当月薪水、计算月薪、显示信息
兼职技术人员:
姓名、编号、工作小时、每小时工资额、当月薪水、计算月薪、显示信息;
兼职销售员:
姓名、编号、销售额、销售额提成、当月薪水、计算月薪、显示信息
要求:
人员编号基数为1000,每输入一个人员信息编号顺序加1
月薪计算办法是经理固定月薪8000元;兼职技术人员按100元/小时领取月薪;兼职推销员按当月销售额的4%提成。
根绝题目要求,设计一个基类employee,然后派生出technician(兼职技术人员)类、manager(经理)类和salesman(兼职销售员)类。
部分成员函数设置为虚函数
将“<<”和“>>”运算符
#include
#include
#include
#include
usingnamespacestd;
constintMaxr=100;
classEmployee//职工类
{
inttag;//删除标记
intno;//职工编号
charname[20];
charzw[20];//职工姓名
intsalary;//职工工资
public:
Employee(){}
char*getname(){returnname;}//获取名字
intgettag(){returntag;}//获取标记
intgetno(){returnno;}//获取编号
intgetsalary(){returnsalary;}
voidsetzw(charq[])//设置名字
{
strcpy(zw,q);
}
voidsetname(charna[])//设置名字
{
strcpy(name,na);
}
voidgetsalary(intsa){salary=sa;}
voiddelna(){tag=1;}//删除
voidaddemp(intn,intsa,char*na,char*q)//增加
{
tag=0;
no=n;
salary=sa;
strcpy(name,na);
strcpy(zw,q);
}
voiddisp()//显示职工信息
{
cout<<"│"<cout<<"├—————┼—————┼—————┼—————┤"<}
};
classDatabase//职工数据类
{
inttop;
Employeeread[Maxr];
public:
Database()//将职工信息从employee.txt读取到read[]中
{Employees;
top=-1;
fstreamfile("employee.txt",ios:
:
in);
while
(1)
{
file.read((char*)&s,sizeof(s));
if(!
file)break;
top++;
read[top]=s;
}
file.close();
}
voidclear()//删除所有
{
top=-1;
}
intaddemp(intn,intsa,char*na,char*q)//增加职工
{
Employee*p=query(n);
if(p==NULL)
{
top++;
read[top].addemp(n,sa,na,q);
return1;
}
return0;
}
Employee*query(intempid)
{
for(inti=0;i<=top;i++)
if(read[i].getno()==empid&&read[i].gettag()==0)
return&read[i];
returnNULL;
}
Employee*query1(charempna[20])
{
for(inti=0;i<=top;i++)
if((read[i].getname()==empna)&&read[i].gettag()==0)
return&read[i];
returnNULL;
}
voiddisp()//职工信息显示
{
for(inti=0;i<=top;i++)
read[i].disp();
}
voidempdata();
~Database()//将read[]中的信息读如到employee.txt中
{
fstreamfile("employee.txt",ios:
:
out);
for(inti=0;i<=top;i++)
if(read[i].gettag()==0)
file.write((char*)&read[i],sizeof(read[i]));
file.close();
}
};
voidDatabase:
:
empdata()//职工维护
{
intchoice=1;
intm=1;intb=1;
charrname[20];
intempid;intempsa;charq[20];
Employee*r;
while(choice!
=0)
{
cout<<"职工维护1:
新增2:
更改3:
删除4:
查找5:
显示6:
全删0:
退出=>";
cin>>choice;
switch(choice)
{
case1:
cout<cout<cout<1,并按回车键│\n";
cout<2,并按回车键│\n";
cout<3,并按回车键│\n";
cout<cin>>m;
while(m!
=0){
switch(m)
{
case1:
cout<<"输入经理编号:
";
cin>>empid;
cout<<"输入奖金:
";
cin>>empsa;
cout<<"输入经理姓名:
";
cin>>rname;
addemp(empid,8000+empsa,rname,"经理");
break;
case2:
cout<<"输入业务经理编号:
";
cin>>empid;
cout<<"输入月提成:
";
cin>>empsa;
cout<<"输入业务经理姓名:
";
cin>>rname;
addemp(empid,4000+empsa,rname,"业务经理");
break;
case3:
cout<<"输入职工编号:
";
cin>>empid;
cout<<"输入工资:
";
cin>>empsa;
cout<<"输入职工姓名:
";
cin>>rname;
addemp(empid,empsa,rname,"普通职工");
break;
}
break;
}
break;
case2:
cout<<"输入职工编号:
";
cin>>empid;
r=query(empid);
if(r==NULL)
{
cout<<"该职工不存在"<break;
}
cout<<"输入新的工资:
"<cin>>empsa;
r->getsalary(empsa);
cout<<"请输入新的职务"<cin>>q;
r->setzw(q);
addemp(empid,empsa,rname,q);
break;
case3:
cout<<"输入职工编号:
";
cin>>empid;
r=query(empid);
if(r==NULL)
{
cout<<"该读者不存在"<break;
}
r->delna();
break;
case4:
cout<cout<cout<cout<cout<cin>>b;
while(b!
=0){
switch(b)
{
case1:
cout<<"输入职工编号:
";
cin>>empid;
r=query(empid);
if(r==NULL)
{
cout<<"该职工不存在"<break;
}
cout<<"├—————┼—————┼—————┼—————┤"<cout<<"│"<cout<<"├—————┼—————┼—————┼—————┤"<r->disp();
break;
case2:
break;
}
break;
}
break;
case5:
cout<<"├—————┼—————┼—————┼—————┤"<cout<<"│"<cout<<"├—————┼—————┼—————┼—————┤"<disp();
break;
case6:
clear();
break;
}
}
}
voidmain()
{
intchoice=1;DatabaseEmpDB;
while(choice!
=0)
{
cout<<"********************************************************************************"<cout<cout<cout<cout<cout<cout<cout<cout<cout<cout<cout<cout<cin>>choice;
switch(choice)
{
case1:
while
(1){
cout<EmpDB.empdata();
break;
break;}
}
}
}
3、堆栈的特点是:
先进先出
定义了一个堆栈类stack,包括初始化,压栈(就是将元素放在栈顶)、弹栈(取栈顶的一个元素),释放堆栈等操作
要求运用模版实现,堆栈中可以根据需求放入double、int、char*等数据对象。
4、上课教材的课后习题