第8章习题答案Word文档下载推荐.docx
《第8章习题答案Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《第8章习题答案Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
在C++中,基类指针可以指向派生类对象,以及基类中拥有虚函数,是支持多态性的前提。
程序通过用同一个基类指针访问不同派生类的虚函数重载版本实现程序运行时的多态。
C++的虚特性负责自动地在程序运行时把基类指针的关联类型转换成当前指向对象的派生类类型。
另外,抽象类机制提供了软件抽象和可扩展性的手段,实现运行时的多态性。
3.如果一个类的虚函数被声明为私有成员函数,会有语法错误吗?
当它作为基类时,可以在应用类体系时实现动态联编吗?
请你验证一下。
【解答】
没有语法错误。
但在应用类体系时无法实现动态编联和多态。
因为私有成员函数只在类内可见,在类外无法调用,无法在类外通过基类指针实现多态。
程序略。
4.虚函数和纯虚函数的区别是什么?
虚函数定义时冠以关键字virtual,本身有实现代码,作用是引导基类指针根据指向对象调用类体系中不同重载版本函数。
纯虚函数是指在说明时代码“为0”的虚函数,即纯虚函数本身并没有实现代码,必须通过它的派生类定义实现版本。
5.阅读下列程序,写出运行结果。
#include<
iostream>
usingnamespacestd;
classT
{public:
T(){a=0;
b=0;
c=0;
}
T(inti,intj,intk)
{a=i;
b=j;
c=k;
voidget(int&
i,int&
j,int&
k)
{i=a;
j=b;
k=c;
Toperator*(Tobj);
private:
inta,b,c;
};
TT:
:
operator*(Tobj)
{Ttempobj;
tempobj.a=a*obj.a;
tempobj.b=b*obj.b;
tempobj.c=c*obj.c;
returntempobj;
}
intmain()
{Tobj1(1,2,3),obj2(5,5,5),obj3;
inta,b,c;
obj3=obj1*obj2;
obj3.get(a,b,c);
cout<
"
(obj1*obj2):
"
<
a="
a<
'
\t'
b="
b<
c="
c<
endl;
(obj2*obj3).get(a,b,c);
(obj2*obj3):
【解答】
(obj1*obj2):
a=5b=10c=15
(obj2*obj3):
a=25b=50c=75
6.阅读下列程序,写出运行结果。
classVector
{public:
Vector(){}
Vector(inti,intj)
{x=i;
y=j;
friendVectoroperator+(Vectorv1,Vectorv2)
{VectortempVector;
tempVector.x=v1.x+v2.x;
tempVector.y=v1.y+v2.y;
returntempVector;
}
voiddisplay()
{cout<
("
x<
"
y<
)"
endl;
intx,y;
{Vectorv1(1,2),v2(3,4),v3;
cout<
v1="
;
v1.display();
v2="
v2.display();
v3=v1+v2;
v3=v1+v2="
v3.display();
v1=(1,2)
v2=(3,4)
v3=v1+v2=(4,6)
7.阅读下列程序,写出运行结果。
classBclass
Bclass(inti,intj){x=i;
y=j;
virtualintfun(){return0;
protected:
intx,y;
classIclass:
publicBclass
Iclass(inti,intj,intk):
Bclass(i,j){z=k;
intfun(){return(x+y+z)/3;
private:
intz;
{Iclassobj(2,4,10);
Bclassp1=obj;
p1.fun()<
endl;
Bclass&
p2=obj;
p2.fun()<
p2.Bclass:
fun()<
Bclass*p3=&
obj;
p3->
5
0
8.阅读下列程序,写出运行结果。
classBase
virtualvoidgetxy(inti,intj=0){x=i;
virtualvoidfun()=0;
intx,y;
};
classA:
publicBase
voidfun()
{cout<
x="
x<
y=x*x="
x*x<
classB:
voidfun()
'
y="
cout<
y=x/y="
x/y<
{Base*pb;
Aobj1;
Bobj2;
pb=&
obj1;
pb->
getxy(10);
fun();
obj2;
getxy(100,20);
x=10y=x*x=100
x=100y=20
y=x/y=5
9.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。
(1)使用成员函数
#include<
cstring>
classs
s(){*str='
\0'
;
s(char*pstr)
{strcpy(str,pstr);
char*gets()
{returnstr;
soperator+(sobj);
charstr[10];
ss:
operator+(sobj)
{strcat(str,obj.str);
returnstr;
//或return*this
}
{sobj1("
Visual"
),obj2("
C++"
),obj3;
obj3=obj1+obj2;
obj3.gets()<
(2)使用友员函数
s(){*str='
s(char*pstr)
{strcpy(str,pstr);
{returnstr;
friendsoperator+(sobj1,sobj2);
charstr[100];
soperator+(sobj1,sobj2)
{stempobj;
strcat(tempobj.str,obj1.str);
strcat(tempobj.str,obj2.str);
10.定义一个整数计算类Integer,实现短整数+,-,*,/基本算术运算。
要求可以进行数据范围检查(-32768~32767,或自行设定),数据溢出时显示错误信息并中断程序运行。
classInteger
{private:
shorta;
public:
Integer(shortn=0){a=n;
Integeroperator+(Integer);
Integeroperator-(Integer);
Integeroperator*(Integer);
Integeroperator/(Integer);
Integeroperator=(Integer);
voiddisplay()
{cout<
IntegerInteger:
operator+(Integerx)
{Integertemp;
if(a+x.a<
-32768||a+x.a>
32767)
{cout<
Dataoverflow!
abort();
temp.a=a+x.a;
returntemp;
operator-(Integerx)
if(a-x.a<
-32768||a-x.a>
temp.a=a-x.a;
returntemp;
operator*(Integerx)
if(a*x.a<
-32768||a*x.a>
32767){cout<
temp.a=a*x.a;
operator/(Integerx)
if(a/x.a<
-32768||a/x.a>
temp.a=a/x.a;
IntegerInteger:
operator=(Integerx)
{a=x.a;
return*this;
{IntegerA(90),B(30),C;
cout<
A="
A.display();
B="
B.display();
C=A+B;
C=A+B="
C.display();
C=A-B;
C=A-B="
C=A*B;
C=A*B="
C=A/B;
C=A/B="
11.使用虚函数编写程序求球体和圆柱体的体积及表面积。
由于球体和圆柱体都可以看做由圆继承而来,所以可以把圆类Circle作为基类。
在Circle类中定义一个数据成员radius和两个虚函数area和volume。
由Circle类派生Sphere类和Column类。
在派生类中对虚函数area和volume重新定义,分别求球体和圆柱体的体积及表面积。
constdoublePI=3.14159265;
classcircle
circle(doubler){radius=r;
virtualdoublearea(){return0.0;
virtualdoublevolume(){return0.0;
doubleradius;
classsphere:
publiccircle
sphere(doubler):
circle(r){}
doublearea()
{return4.0*PI*radius*radius;
doublevolume()
{return4.0*PI*radius*radius*radius/3.0;
classcolumn:
column(doubler,doubleh):
circle(r){height=h;
doublearea()
{return2.0*PI*radius*(height+radius);
{returnPI*radius*radius*height;
private:
doubleheight;
{circle*p;
spheresobj
(2);
p=&
sobj;
cout<
球体:
体积="
p->
volume()<
表面积="
area()<
columncobj(3,5);
p=&
cobj;
圆柱体:
12.某学校对教师每月工资的计算规定如下:
固定工资+课时补贴。
教授的固定工资为5000元,每个课时补贴50元。
副教授的固定工资为3000元,每个课时补贴30元。
讲师的固定工资为2000元,每个课时补贴20元。
定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。
classteacher
teacher(chartname[],inttime)
{strcpy(name,tname);
coursetime=time;
virtualintpay()=0;
virtualvoidprint()=0;
char*getname()
{returnname;
intgetcoursetime()
{returncoursetime;
protected:
charname[30];
intcoursetime;
classprofessor:
publicteacher
professor(charpname[],inttime):
teacher(pname,time){}
intpay()
{return5000+coursetime*50;
voidprint()
教授:
getname();
classassociateprofessor:
associateprofessor(charpname[],inttime):
intpay()
{return3000+coursetime*30;
voidprint()
副教授:
getname();
classlecturer:
lecturer(charpname[],inttime):
{return2000+coursetime*20;
{cout<
讲师:
{professorpobj("
李小平"
32);
pobj.print();
工资:
pobj.pay()<
associateprofessorapobj("
王芳芳"
56);
apobj.print();
apobj.pay()<
lecturerlobj("
何大建"
72);
lobj.print();
lobj.pay()<