多态练习题.docx
《多态练习题.docx》由会员分享,可在线阅读,更多相关《多态练习题.docx(16页珍藏版)》请在冰豆网上搜索。
多态练习题
1、生成表示学生的类XS提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄,并将他们全部定义为纯虚函数;生成CZS类表示初中生,包含数据成
员xm、xb和nl表示学生的姓名、性别和年龄,提供成员函数dispXM()、dispXB()和dispNL()分别用来显示姓名、性别和年龄;再生成类GZS表示高中生和类DXS表示大学生,同样包
含相同含义的数据成员xm、xb和nI,也包括成员函数dispXM()、dispXB()和dispNL()。
要求:
(1)
设计和实现基本类XS
(2)
设计和实现派生类CZS,GZS^DXS
(3)
分别生成CZSGZSDXS类对象
(4)
将CZSGZSDXS类对象的指针赋给指针赋给
XS类的指针变量。
(5)
分别用XS类的指针和引用访问dispXM()、
dispXB()和dispNL()函数
(6)
观察程序结果。
#inelude
#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"<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);
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<<"|1111"<}
};
classDatabase/职工数据类
{
inttop;
Employeeread[Maxr];
public:
Database。
//将职工信息从employee.txt读取到read[]中{Employees;
top=-1;
fstreamfile("employee.txt",ios:
:
in);
while
(1)
{
((char*)&s,sizeof(s));
if(!
file)break;
top++;
read[top]=s;
}
();
}
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)
((char*)&read[i],sizeof(read[i]));
();
}
};
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<I—;
请选择您所需的操作丨\n";
经理:
1,并按回车键I\n";业务经理:
2,并按回车键|\n”;
普通职工:
3,并按回车键|\n”;
1—;
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<<"该职工不存在"<}
cout<<"输入新的工资:
"<>empsa;
r->getsalary(empsa);
cout<<"请输入新的职务"<>q;
r->setzw(q);
addemp(empid,empsa,rname,q);break;
case3:
cout<<"输入职工编号:
";cin>>empid;
r=query(empid);
if(r==NULL)
{
cout<<"该读者不存在"<}
r->delna();break;
case4:
cout<1
-讨
cout<请选|择您所需的操作
|\n";
cout<按编|号查找1,并按回车键
|\n";
cout<返回I2,并按回车键
|\n";
cout<1
——什
cin>>b;
while(b!
=0){
switch(b)
{
case1:
cout<<"输入职工编号:
";
cin>>empid;
r=query(empid);
if(r==NULL)
{
cout<<"该职工不存在"<break;
}
"<"<"<cout<<"|1111
cout<<"|"<"<<"|"<cout<<"|1111
r->disp();
break;
case2:
break;
}
break;}
break;
case5:
cout<<"|1111"<cout<<"|"<"<<"|"<cout<<"|1111"<disp();
break;
case6:
clear();
break;
}
}
}
voidmain()
{
intchoice=1;DatabaseEmpDB;
while(choice!
=0)
{
cout
/“********************************************************************************"<cout<cout<H******************************
欢迎使用职工管理系统
<******************************"cout<cout<cout<1
cout<|请选择您所需的操作
|\n";
cout<\n"|;|
cout<操作11,并按回车键
|\n";
cout<\n"|;|
cout<返回|0,并按回车键
|\n";
cout<1
—什
cin>>choice;switch(choice)
{
case1:
while
(1){
cout<EmpDB.empdata();
break;
break;}
}
}
}
3、堆栈的特点是:
先进先出
定义了一个堆栈类stack,包括初始化,压栈(就是将元素放在栈顶)、弹栈(取栈顶的
一个元素),释放堆栈等操作
要求运用模版实现,堆栈中可以根据需求放入double、int、char*等数据对象。
4、上课教材的课后习题