};
intmain()
{
inti=9;
Derivedd1(i);
return0;
}
答案:
基类带参构造函数9
派生类带参构造函数9
派生类析构
基类析构
一、编程题
1.设向量X=(x1,x2,…,xn)和Y=(y1,y2…,yn),它们之间的加、减分别定义为:
X+Y=(x1+y1,x2+y2,…,xn+yn)
X-Y=(x1-y1,x2-y2,…,xn-yn)
编程序定义向量类Vector,重载运算符”+”、”-“、”=”,实现向量之间的加、减和赋值运算;用重载运算符”>>”、”<<”做向量的输入/输出操作。
注意检测运算的合法性。
答案:
#include
//usingnamespacestd;
classVector{
intvec[10];
public:
Vector(intv[10]);
Vector();
Vector(Vector&);
Vectoroperator+(Vector&);
Vectoroperator-(Vector&);
friendostream&operator<<(ostream&out,Vector&);
};
Vector:
:
Vector(intv[10]){
inti;
for(i=0;i<10;i++)vec[i]=v[i];
}
Vector:
:
Vector(){
inti;
for(i=0;i<10;i++)vec[i]=0;
}
Vector:
:
Vector(Vector&v){
inti;
for(i=0;i<10;i++)vec[i]=v.vec[i];
}
VectorVector:
:
operator+(Vector&v){
Vectorz;
inti;
for(i=0;i<10;i++)
z.vec[i]=vec[i]+v.vec[i];
returnz;
}
VectorVector:
:
operator-(Vector&v){
Vectorz;
inti;
for(i=0;i<10;i++)
z.vec[i]=vec[i]-v.vec[i];
returnz;
}
ostream&operator<<(ostream&out,Vector&v){
for(inti=0;i<10;i++)
out<returnout;
}
voidmain(){
inta[10]={-4,1,0,10,5,-9,8,13,6,2,};
intb[10]={-11,8,10,17,-6,9,6,7,12,5};
Vectorv1(a),v2(b),v3,v4;
v3=v1+v2;
v4=v2-v1;
cout<cout<}
2.定义一个Girl类和一个Boy类,这两个类中都有表示姓名、年龄的私有成员变量,
都要定义构造函数,析构函数是否定义根据类的数据成员定义情况而定.输出成员变量信息的公有成员函数voidprint();。
①根据要求定义相应的类。
②将Girl类作为Boy类的友元类,在Girl类中定义成员函数voidVisitBoy(Boy&)中访问Boy类引用参数的私有成员,如果Boy类中年龄成员值小于20,则一律改为20,其余情况下不用修改.
③定义一个普通函数voidVisitBoyGirl(constBoy&,constGirl&),作为以上两个类的友元函数,在其中直接访问其数据成员而非调用类的print函数,通过调用该函数输出男孩和女孩的信息。
④主函数的代码已给出,请将程序补充完整
intmain()
{
Boyb1("Nike",19),b2("Mike",32);
Girlg("Alice",18);
b1.print();
b2.print();
g.print();
g.VisitBoy(b1);
VisitBoyGirl(b1,g);
return0;
}
答案:
#include
#include
usingnamespacestd;
classGirl;
classBoy
{
stringname;
intage;
intmoney;
public:
Boy(stringn,inta,intm);
voidprint();
friendclassGirl;
friendvoidMemorialDay(constBoy&,constGirl&);
};
classGirl
{
stringname;
intage;
intmoney;
public:
Girl(stringn,inta,intm);
voidprint();
voidVisitBoy(Boy&);
friendvoidMemorialDay(constBoy&,constGirl&);
};
Boy:
:
Boy(stringn,inta,intm)
{
name=n;
age=a;
money=m;
}
voidBoy:
:
print()
{
cout<}
Girl:
:
Girl(stringn,inta,intm)
{
name=n;
age=a;
money=m;
}
voidGirl:
:
print()
{
cout<}
voidGirl:
:
VisitBoy(Boy&b)
{
if(b.money>100){
inttemp=b.money-100;
b.money=100;
this->money+=100;
}
}
voidMemorialDay(constBoy&b,constGirl&g)
{
b.money=0;
cout<cout<}
intmain()
{
Boyb1("Nike",19),b2("Mike",22);
Girlg("Alice",18);
b1.print();
b2.print();
g.print();
g.VisitBoy(b1);
MemorialDay(b1,g);
return0;
}
3.某公司雇员(employee)包括经理(manager),技术人员(technician)和销售员(salesman)。
开发部经理(developermanger),既是经理也是技术人员。
销售部经理(salesmanager),既是经理也是销售员。
编程实现工资管理。
(加分项:
实现最少一个类的拷贝构造函数)
以employ类为虚基类派生出manager,technician和salesman类;再进一步派生出developermanager和salesmanager类。
employee类的属性包括姓名、职工号、工资级别,月薪(实发基本工资加业绩工资)。
操作包括月薪计算函数(pay()),该函数要求输入请假天数,扣去应扣工资后,得出实发基本工资。
technician类派生的属性有每小时附加酬金和当月工作时数,及研究完成进度系数。
业绩工资为三者之积。
也包括同名的pay()函数,工资总额为基本工资加业绩工资。
salesman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。
也包括同名的pay()函数,工资总额为基本工资加业绩工资。
manager类派生属性有固定奖金额和业绩系数,业绩工资为两者之积。
工资总额也为基本工资加业绩工资。
而developermanager类,pay()函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。
salesamanager类,pay()函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。
答案:
#include
#include
usingnamespacestd;
staticintGrades[]={500,600,750,1000,1400,2000,2800,4000};
classemployee{
protected:
stringname;//姓名
intID;//职工号
intgrade;//工资级别
doublesalary;//月
doublebase_salary;//基本月薪
doublecareer_salary;//业绩工资
public:
employee(string="",int=0,int=0);
virtualvoidpay();//月薪计算函数
voidshow();
doublegetsalary(){returnsalary;}
doublegetbase_salary(){returnbase_salary;}
doublegetcareer_salary(){returncareer_salary;}
};
employee:
:
employee(stringnn,intid,intgr){
name=nn;
ID=id;
grade=gr;
salary=0;//月薪
base_salary=0;//基本月薪
career_salary=0;//业绩工资
}
employee:
:
employee(employee&emp){//拷贝构造函数
name=emp.name;
ID=emp.ID;
grade=emp.grade;
salary=emp.salary;//月薪
base_salary=emp.base_salary;//基本月薪
career_salary=emp.career_salary;//业绩工资
}
voidemployee:
:
show(){
cout<}
voidemployee:
:
pay(){
intdays;
cout<<"请输入请假天数:
\n";
cin>>days;
base_salary=Grades[grade]*(23-days)/23;
career_salary=base_salary/2;//普通员工业绩工资为基本工资的一半
salary=base_salary+career_salary;
}
classmanager:
virtualpublicemployee{//虚基类
protected:
doubleprize;//固定奖金额
doublefactor;//业绩系数
public:
manager(string="",int=0,int=0,double=0);
voidpay();
};
manager:
:
manager(stringnn,intid,intgr,doublepr):
employee(nn,id,gr){
prize=pr;//固定奖金额
factor=0;
}
voidmanager:
:
pay(){
intdays;
cout<<"请输入请假天数:
\n";
cin>>days;
cout<<"请输入业绩系数:
\n";
cin>>factor;
base_salary=Grades[grade]*(23-days)/23;
career_salary=prize*factor*(23-days)/23;
salary=base_salary+career_salary;
}
classtechnician:
virtualpublicemployee{
protected:
doublehours;//月工作时数
doubleperhour;//每小时附加酬金
doubleshfactor;//研究进度系数
public:
technician(string="",int=0,int=0,double=0);
voidpay();
};
technician:
:
technician(stringnn,intid,intgr,doublephr):
employee(nn,id,gr){
hours=0;
perhour=phr;//每小时附加酬金
shfactor=0;
}
voidtechnician:
:
pay(){
intdays;
cout<<"请输入请假天数:
\n";
cin>>days;
cout<<"请输入研究进度系数:
\n";
cin>>shfactor;
hours=8*(23-days);
base_salary=Grades[grade]*(23-days)/23;
career_salary=perhour*hours*shfactor*(23-days)/23;
salary=base_salary+career_salary;
}
classsalesman:
virtualp