private:
Base1b1;
Base2b2;
};
intmain()
{Aobj(1,2,3,4);}
答:
调用基类BASE1的构造函数:
3
调用基类BASE2的构造函数:
2
调用基类BASE1的构造函数:
4
调用基类BASE2构造函数:
1
调用派生类A的构造函数:
10
9.分析下列程序的运行结果。
#include
classA
{public:
A(constchar*s){cout<
~A(){}
};
classB:
virtualpublicA
{public:
B(constchar*s1,constchar*s2):
A(s1)
{cout<};
classC:
virtualpublicA
{public:
C(constchar*s1,constchar*s2):
A(s1)
{cout<};
classD:
publicB,publicC
{public:
D(constchar*s1,constchar*s2,constchar*s3,constchar*s4)
:
B(s1,s2),C(s1,s3),A(s1)
{cout<};
intmain()
{D*ptr=newD("classA","classB","classC","classD");
deleteptr;
}
答:
classA
classB
classC
classD
10.有人定义一个教师类派生一个学生类。
他认为“姓名”和“性别”是教师、学生共有的属性,声明为public,“职称”和“工资”是教师特有的,声明为private。
在学生类中定义特有的属性“班级”和“成绩”。
所以有
classteacher
{public:
charname[20];charsex;
//……
Private:
chartitle[20];doublesalary;
};
classstudent:
publicteacher
{//……
private:
chargrade[20];intscore;
};
你认为这样定义合适吗?
请做出你认为合理的类结构定义。
答:
不合适,这样导致数据冗余。
合理的结构是提取它们共有的数据和操作定义一个基类,然后分别定义teacher和student作为派生类。
classperson
{protected:
charname[20];charsex;
//……
};
classteacher:
publicteache
{//……
private:
chartitle[20];doublesalary;
};
classstudent:
publicteacher
{//……
private:
chargrade[20];intscore;
};
11.定义一个描述坐标位置的类location,从location派生出正方形类square,在正方形类中将location类作为正方形的起始点,并求正方形的周长和面积。
答:
#include
classlocation
{
protected:
intx,y;
public:
location(inta=0,intb=0)
{
x=a;
y=b;
}
};
classsquare:
publiclocation
{
private:
intlen;
intgirth;
intarea;
public:
square(intx,inty,intt):
location(x,y)
{
len=t;
}
voidset();
voidshow();
};
voidsquare:
:
set()
{
girth=4*len;
area=len*len;
}
voidsquare:
:
show()
{
cout<<"正方形的坐标点为:
"<cout<<"正方形的周长为:
"<cout<<"正方形的面积为:
"<
}
voidmain()
{
squarem(10,10,5);
m.set();
m.show();
}
12.把定义平面直角坐标系上的一个点的类Point作为基类,派生出描述一条直线的类Line,再派生出一个矩形类Rect。
要求成员函数能求出两点间的距离,矩形的周长和面积等。
设计一个测试程序,并构造完整的程序。
答:
#include
#include
usingnamespacestd;
classPoint{
public:
Point(intx=0,inty=0)
{
this->x=x;
this->y=y;
}
public:
intx,y;
};
classLine:
publicPoint
{
public:
Line(intx1=0,inty1=0,intx2=0,inty2=0)
:
a(x1,y1),b(x2,y2)
{}
doubleLength(){
ints=a.x-b.x;
intt=a.y-b.y;
returnsqrt(s*s+t*t);
}
private:
Pointa,b;
};
classRect:
publicLine{
public:
Rect(intx1,inty1,intx2,inty2):
l1(x1,y1,x1,y2),l2(x1,y1,x2,y1)//x1,y1是矩形左下角的坐标,x2,y2是矩形右上角的坐标
{
}
doubleSumLength(){
//cout<<"矩形的周长是"<<<return(l1.Length()+l2.Length())*2;
}
doublesquare(){
//cout<<"矩形的周长是"<<<returnl1.Length()*l2.Length();
}
private:
Linel1,l2;
};
voidmain(){
Lineline(0,0,10,0);
cout<<"这条线段的长度为:
"<Rectrect(0,0,10,10);
cout<<"矩形的周长是"<cout<<"矩形的周长是"<}
13.假设某销售公司有销售经理和销售员工,月工资的计算办法是:
销售经理的固定月薪为8000元并提取销售额的5/1000作为工资;销售员工只提取销售额的5/1000作为工资。
编一程序,定义一个基类Employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。
由Employee类派生Salesman类,再由Salesman类派生Salesmanager类。
Salesman类包含两个新数据成员commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay和用于输出的成员函数print。
Salesmanager类包含新数据成员monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay、用于输出的成员函数print()。
在main函数中,测试你的类结构,求若干个不同员工的工资。
答:
#include
usingnamespacestd;
classemployee
{public:
employee()
{cout<<"编号:
";cin>>number;
cout<<"姓名:
";cin>>name;
salary=0;
}
protected:
charnumber[5];
charname[10];
doublesalary;};
classsalesman:
publicemployee
{public:
salesman(){commrate=0.005;}
voidpay()
{cout<";
cin>>sales;
salary=sales*commrate;
}
voidprint()
{cout<<"销售员:
"<"<"<protected:
doublecommrate;
doublesales;
};
classsalesmanager:
publicsalesman
{public:
salesmanager()
{monthlypay=8000;
commrate=0.005;
}
voidpay()
{cout<";
cin>>sales;
salary=monthlypay+sales*commrate;
}
voidprint()
{cout<<"销售经理:
"<"<"<private:
doublemonthlypay;
};
intmain()
{salesmanobj1;
obj1.pay();
obj1.print();
salesmanagerobj2;
obj2.pay();
obj2.print();
}
14.编写一个程序实现那一个班级学生的学期成绩管理。
个人信息类Person的数据成员有:
姓名,年龄,性别;课程类Course的数据成员有:
课程名,学分,成绩;
学生类Student从Person类派生,并增加数据成员:
学号,Course对象数据成员数组(大小为8),总成绩,总学分和平均成绩;
班级类Class类的数据成员有:
Student类对象成员数组(大小由构造函数确定),班号,班级人数等。
要求:
(1)本班级Class类的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中释放。
在类Class中添加成员函数Seek,通过学号查找并输出该学生的全部信息。
(2)构造三个学生的数据,每个学生都有三门课程的成绩,输入并显示这些数据。
(3)根据类的需要添加适当的其他成员,编写完整的程序并测试。
答:
#include
#include
classPerson{
public:
Person(char*name,intage,charsex='M')
{
strncpy(this->name,name,20);
this->age=age;
this->sex=sex;
}
voidshow(){
cout<<"学生的名字是:
"<cout<<"学生的年龄是:
"<cout<<"学生的性别是:
"<}
private:
charname[20];
intage;
charsex;
};
classCourse{
public:
Course(){
cout<<"请输入课程名,学分和分数"<cin>>coursename>>credit>>score;
}
public:
charcoursename[20];
floatscore;
floatcredit;
};
classStudent:
Person{
public:
Student(char*name="NULL",intage=0,charsex='M',char*no="0"):
Person(name,age,sex),Course()
{
strncpy(this->no,no,20);
}
doubleMscoresum()
{
scoresum=0;
for(inti=0;i<2;i++)
scoresum+=Cour[i].score;
returnscoresum;
}
doubleMcreditsum()
{
creditsum=0;
for(inti=0;i<2;i++)
creditsum+=Cour[i].credit;
returncreditsum;
}
voidShow(){
Person:
:
show();
cout<<"学号为:
"<cout<<"总的学分为:
"<cout<<"总的成绩为:
"<}
public:
charno[20];
CourseCour[2];
floatscoresum;
floatcreditsum;
};
classClass{
private:
Student*stu;
charclassno[20];
intn;//班级人数
public:
Class(intn,char*classno)
{
this->n=n;
strncpy(this->classno,classno,20);
stu=(Student*)newStudent[n];
}
~Class()
{
if(stu)delete[]stu;
stu=NULL;
}
voidSeek(char*no)
{
for(inti=0;iif(no==stu[i].no)
stu[i].Show();
break;
}
if(i==8)
cout<<"找不到该学生"<}
voidShow(){
cout<<"班级的学号为"<";
for(inti=0;istu[0].Show();
}
};
voidmain(){
Classcla(5,"1");
cla.Show();
//Studentstu("Wang",16,'F',"4");
//stu.Show();
}