习题答案文档格式.docx
《习题答案文档格式.docx》由会员分享,可在线阅读,更多相关《习题答案文档格式.docx(19页珍藏版)》请在冰豆网上搜索。
![习题答案文档格式.docx](https://file1.bdocx.com/fileroot1/2023-2/2/65194150-5c3f-404d-943c-16f7aff43204/65194150-5c3f-404d-943c-16f7aff432041.gif)
class<
派生类名>
:
<
继承方式>
基类名>
{
派生类中新成员定义
}
派生类有两个或两个以上的基类称为多重继承。
多重继承的定义格式为:
继承方式1>
基类名1>
,<
继承方式2>
基类名2>
,……<
继承方式n>
基类名n>
3.继承有哪三种继承方式,各自有何特点?
继承方式主要表示派生类继承基类时采用的继承方式,主要有三种,即公有继承、私有继承和保护继承。
(1)公有继承(public)。
公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。
(2)私有继承(private)
私有继承的特点是基类的公有成员和保护成员作为派生类的私有成员,并且不能被这个派生类的子类访问。
(3)保护继承(protected)
保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。
4.在定义派生类的过程中,如何对基类的数据成员进行初始化?
由于基类在派生类中通常是隐藏的,所以依序通过调用基类的构造函数来设定基类的数据成员的初值。
它的格式为<
(形参表):
基类1(参数表),基类2(参数表)…对象成员1(参数表),对象成员2(参数表)…{}
5.什么是赋值兼容规则?
赋值兼容规则的实质是什么?
试举例说明。
赋值兼容规则是指,对于共有派生类来说,可以将派生类的对象赋值给其基类。
它实质上就是基类对象的内存空间和派生类对象中基类拷贝的内存空间引用的兼容。
6.什么是虚基类?
它的作用是什么?
虚基类不是指基类是虚的,而是指在派生类中指定的基类是虚继承的方式。
使用虚基类的目的是在多重派生中使用共有基类在派生类中只有一个拷贝从而解决有多个基类拷贝所产生的二义性问题。
7.分析下列程序的运行结果。
#include<
>
classA
private:
inta;
public:
A(inti=0){a=i;
voidshow(){cout<
"
a="
a<
endl;
};
classB
intb;
B(inti=0){b=i;
voidshow()
{cout<
b="
b<
classC:
publicA,publicB
private:
intc;
C(inti=0,intj=0,intk=0):
A(i),B(j)
{c=k;
voidshow()
{
A:
:
show();
B:
cout<
c="
c<
}
voidmain()
Bb(12);
();
Cc1,c2(30,40),c3(70,80,90);
:
程序运行结果:
b=12
a=0
b=0
c=0
a=30
b=40
a=70
b=80
c=90
分析:
(1)本程序是多重继承的程序,类C继承了类A和类B的数据成员。
(2)在主程序中,分别对类C的对象c1、c2、c3赋不同的值,则对类A和类B数据成员的赋值也不一样。
8.分析下列程序的运行结果。
classBase1
{public:
Base1(inti){cout<
"
调用基类Base1的构造函数:
<
i<
endl;
}
classBase2
{public:
Base2(intj){cout<
调用基类Base2的构造函数:
j<
classA:
publicBase1,publicBase2
A(inta,intb,intc,intd):
Base2(b),Base1(c),b2(a),b1(d)
{cout<
调用派生类A的构造函数:
a+b+c+d<
endl;
}
private:
Base1b1;
Base2b2;
};
intmain()
{Aobj(1,2,3,4);
调用基类BASE1的构造函数:
3
调用基类BASE2的构造函数:
2
4
调用基类BASE2构造函数:
1
10
9.分析下列程序的运行结果。
A(constchar*s){cout<
s<
~A(){}
classB:
virtualpublicA
B(constchar*s1,constchar*s2):
A(s1)
s2<
classC:
C(constchar*s1,constchar*s2):
A(s1)
classD:
publicB,publicC
D(constchar*s1,constchar*s2,constchar*s3,constchar*s4)
B(s1,s2),C(s1,s3),A(s1)
s4<
{D*ptr=newD("
classA"
"
classB"
classC"
classD"
);
deleteptr;
classC
classD
10.有人定义一个教师类派生一个学生类。
他认为“姓名”和“性别”是教师、学生共有的属性,声明为public,“职称”和“工资”是教师特有的,声明为private。
在学生类中定义特有的属性“班级”和“成绩”。
所以有
classteacher
{public:
charname[20];
charsex;
定义一个描述坐标位置的类location,从location派生出正方形类square,在正方形类中将location类作为正方形的起始点,并求正方形的周长和面积。
classlocation
protected:
intx,y;
location(inta=0,intb=0)
x=a;
y=b;
classsquare:
publiclocation
intlen;
intgirth;
intarea;
square(intx,inty,intt):
location(x,y)
len=t;
voidset();
voidshow();
voidsquare:
set()
girth=4*len;
area=len*len;
show()
正方形的坐标点为:
x<
"
y<
正方形的周长为:
girth<
正方形的面积为:
area<
squarem(10,10,5);
12.把定义平面直角坐标系上的一个点的类Point作为基类,派生出描述一条直线的类Line,再派生出一个矩形类Rect。
要求成员函数能求出两点间的距离,矩形的周长和面积等。
设计一个测试程序,并构造完整的程序。
iostream>
cmath>
usingnamespacestd;
classPoint{
public:
Point(intx=0,inty=0)
this->
x=x;
y=y;
public:
classLine:
publicPoint
Line(intx1=0,inty1=0,intx2=0,inty2=0)
:
a(x1,y1),b(x2,y2)
{}
doubleLength(){
ints=intt=returnsqrt(s*s+t*t);
Pointa,b;
classRect:
publicLine{
Rect(intx1,inty1,intx2,inty2):
l1(x1,y1,x1,y2),l2(x1,y1,x2,y1)假设某销售公司有销售经理和销售员工,月工资的计算办法是:
销售经理的固定月薪为8000元并提取销售额的5/1000作为工资;
销售员工只提取销售额的5/1000作为工资。
编一程序,定义一个基类Employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。
由Employee类派生Salesman类,再由Salesman类派生Salesmanager类。
Salesman类包含两个新数据成员commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay和用于输出的成员函数print。
Salesmanager类包含新数据成员monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay、用于输出的成员函数print()。
在main函数中,测试你的类结构,求若干个不同员工的工资。
#include<
classemployee
employee()
编号:
;
cin>
number;
cout<
姓名:
name;
salary=0;
protected:
charnumber[5];
charname[10];
doublesalary;
};
classsalesman:
publicemployee
salesman(){commrate=;
voidpay()
{cout<
name<
本月销售额:
;
sales;
salary=sales*commrate;
voidprint()
销售员:
number<
本月工资:
salary<
doublecommrate;
doublesales;
classsalesmanager:
publicsalesman
salesmanager()
{monthlypay=8000;
commrate=;
本月部门销售额:
cin>
salary=monthlypay+sales*commrate;
voidprint()
销售经理:
doublemonthlypay;
{salesmanobj1;
salesmanagerobj2;
14.编写一个程序实现那一个班级学生的学期成绩管理。
个人信息类Person的数据成员有:
姓名,年龄,性别;
课程类Course的数据成员有:
课程名,学分,成绩;
学生类Student从Person类派生,并增加数据成员:
学号,Course对象数据成员数组(大小为8),总成绩,总学分和平均成绩;
班级类Class类的数据成员有:
Student类对象成员数组(大小由构造函数确定),班号,班级人数等。
要求:
(1)本班级Class类的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中释放。
在类Class中添加成员函数Seek,通过学号查找并输出该学生的全部信息。
(2)构造三个学生的数据,每个学生都有三门课程的成绩,输入并显示这些数据。
(3)根据类的需要添加适当的其他成员,编写完整的程序并测试。
classPerson{
Person(char*name,intage,charsex='
M'
)
strncpy(this->
name,name,20);
age=age;
sex=sex;
voidshow(){
cout<
学生的名字是:
学生的年龄是:
age<
学生的性别是:
sex<
private:
charname[20];
intage;
classCourse{
Course(){
请输入课程名,学分和分数"
cin>
coursename>
credit>
score;
charcoursename[20];
floatscore;
floatcredit;
classStudent:
Person{
Student(char*name="
NULL"
intage=0,charsex='
char*no="
0"
):
Person(name,age,sex),Course()
no,no,20);
}
doubleMscoresum()
scoresum=0;
for(inti=0;
i<
2;
i++)
scoresum+=Cour[i].score;
returnscoresum;
doubleMcreditsum()
creditsum=0;
creditsum+=Cour[i].credit;
returncreditsum;
voidShow(){
Person:
学号为:
no<
总的学分为:
Mcreditsum()<
总的成绩为:
Mscoresum()<
charno[20];
CourseCour[2];
floatscoresum;
floatcreditsum;
classClass{
Student*stu;
charclassno[20];
intn;
o)
stu[i].Show();
break;
if(i==8)
cout<
找不到该学生"
voidShow(){
班级的学号为"
classno<
共有"
n<
个学生,他们分别是:
for(inti=0;
n;
stu[0].Show();
voidmain(){
Classcla(5,"
1"
);
();
//Studentstu("
Wang"
16,'
F'
4"
//();