版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第八章多态1.单选题.下列关于运算符重载的描述中,(D(A)可以改变参与运算的操作数个数(C)可以改变运算符原来的结合性.下列函数中,不能重载运算符的函数是((A)成员函数(B)1.单选题.下列关于运算符重载的描述中,(D(A)可以改变参与运算的操作数个数(C)可以改变运算符原来的结合性.下列函数中,不能重载运算符的函数是((A)成员函数(B)构造函数.要求用成员函数重载的运算符是((A)=(B)==.要求用友员函数重载的运算符是((A)=(B)[])是正确的。
(D)
bA)。(C)<=C)。(C)<<可以改变运算符原来的优先级不能改变原运算符的语义)。普通函数(D)友员函数(D)++(5).在C++中,要实现动态联编,必须使用(D(D))调用虚函数。()(A)类名(B)派生类指针(C)对象名(D)基类指针6).下列函数中,不能说明为虚函数的是(C)。(A)私有成员函数(B)公有成员函数(C)构造函数(D)(A)私有成员函数顺序和函数的返回值(7顺序和函数的返回值(A)。相同不同(C)相容相同不同(C)相容(D)部分相同(8).C++中,根据D)识别类层次中不同类定义的虚函数版本。(A)(8).C++中,根据D)识别类层次中不同类定义的虚函数版本。(A)参数个数(B)参数类型(C)函数名(D)this指针类型.虚析构函数的作用是(C)。(A)虚基类必须定义虚析构函数(B)类对象作用域结束时释放资源(C)delete动态对象时释放资源(A)虚基类必须定义虚析构函数(B)类对象作用域结束时释放资源(C)delete动态对象时释放资源(D)无意义.下面函数原型中,(.下面函数原型中,()声明了fun为纯虚函数。(A)voidfun()=0;(B)virtualvoidfun()=0;(A)voidfun()=0;(B)virtualvoidfun()=0;virtualvoidfun();virtualvoidfun(){virtualvoidfun();virtualvoidfun(){};.若一个类中含有纯虚函数,则该类称为(C)。(A)基类(B)(A)基类(B)纯基类(C)抽象类(D)派生类.假设Aclass为抽象类,下列正确的说明语句是(B)。(A)Aclassfun(int);(B)Aclass*(A)Aclassfun(int);(B)Aclass*p;(C)intfun(Aclass);(D)AclassObj;2•在C++中,使用类体系依靠什么机制实现程序运行时的多态?解答】在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<<'\t'<<"c="<<c<<'\t'<<endl;(obj2*obj3).get(a,b,c);cout<<"(obj2*obj3):"<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<'\t'<<endl;}【解答】(obj1*obj2):a=5b=10c=15(obj2*obj3):a=25b=50c=756.阅读下列程序,写出运行结果。#include<iostream>usingnamespacestd;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;}private:intx,y;};intmain(){Vectorv1(1,2),v2(3,4),v3;cout<<"v1=";v1.display();cout<<"v2=";v2.display();v3=v1+v2;cout<<"v3=v1+v2=";v3.display();}【解答】v1=(1,2)v2=(3,4)v3=v1+v2=(4,6)7.阅读下列程序,写出运行结果。#include<iostream>usingnamespacestd;classBclass{public:Bclass(inti,intj){x=i;y=j;}virtualintfun(){return0;}protected:intx,y;};classIclass:publicBclass{public:Iclass(inti,intj,intk):Bclass(i,j){z=k;}intfun(){return(x+y+z)/3;}private:intz;};intmain(){Iclassobj(2,4,10);Bclassp1=obj;cout<<p1.fun()<<endl;Bclass&p2=obj;cout<<p2.fun()<<endl;cout<<p2.Bclass::fun()<<endl;Bclass*p3=&obj;cout<<p3->fun()<<endl;}【解答】05058.阅读下列程序,写出运行结果。#include<iostream>usingnamespacestd;classBase{public:virtualvoidgetxy(inti,intj=0){x=i;y=j;}virtualvoidfun()=0;protected:intx,y;};classA:publicBase{public:voidfun(){cout<<"x="<<x<<'\t'<<"y=x*x="<<x*x<<endl;}};classB:publicBase{public:voidfun(){cout<<"x="<<x<<'\t'<<"y="<<y<<endl;cout<<"y=x/y="<<x/y<<endl;}};intmain(){Base*pb;Aobj1;Bobj2;pb=&obj1;pb->getxy(10);pb->fun();pb=&obj2;pb->getxy(100,20);pb->fun();}【解答】x=10y=x*x=100x=100y=20y=x/y=59.分别使用成员函数和友员函数编写程序重载运算符“+”,使该运算符能实现两个字符串的连接。【解答】(1)使用成员函数#include<iostream>#include<cstring>usingnamespacestd;classs{public:s(){*str='\0';}s(char*pstr){strcpy(str,pstr);}char*gets(){returnstr;}soperator+(sobj);private:charstr[10];};ss::operator+(sobj){strcat(str,obj.str);returnstr;//或return*this}intmain(){sobj1("Visual"),obj2("C++"),obj3;obj3=obj1+obj2;cout<<obj3.gets()<<endl;}(2)使用友员函数#include<iostream>#include<cstring>usingnamespacestd;classs{public:s(){*str='\0';}s(char*pstr){strcpy(str,pstr);}char*gets(){returnstr;}friendsoperator+(sobj1,sobj2);private:charstr[100];};soperator+(sobj1,sobj2){stempobj;strcat(tempobj.str,obj1.str);strcat(tempobj.str,obj2.str);returntempobj;}intmain(){sobj1("Visual"),obj2("C++"),obj3;obj3=obj1+obj2;cout<<obj3.gets()<<endl;}10.定义一个整数计算类Integer,实现短整数*,/基本算术运算。要求可以进行数据范围检査(-32768〜32767,或自行设定),数据溢出时显示错误信息并中断程序运行。【解答】#include<iostream>usingnamespacestd;classInteger{private:shorta;public:Integer(shortn=0){a=n;}Integeroperator+(Integer);Integeroperator-(Integer);Integeroperator*(Integer);Integeroperator/(Integer);Integeroperator=(Integer);voiddisplay(){cout<<a<<endl;}};IntegerInteger::operator+(Integerx){Integertemp;if(a+x.a<-32768||a+x.a>32767){cout<<"Dataoverflow!"<<endl;abort();}temp.a=a+x.a;returntemp;}IntegerInteger::operator-(Integerx){Integertemp;if(a-x.a<-32768||a-x.a>32767){cout<<"Dataoverflow!"<<endl;abort();}temp.a=a-x.a;returntemp;}IntegerInteger::operator*(Integerx){Integertemp;overflow!"<<endl;if(a*x.a<-32768||a*x.a>32767){cout<<"Dataabort();}overflow!"<<endl;temp.a=a*x.a;returntemp;}IntegerInteger::operator/(Integerx){Integertemp;if(a/x.a<-32768||a/x.a>32767){cout<<"Dataoverflow!"<<endl;abort();}temp.a=a/x.a;returntemp;}IntegerInteger::operator=(Integerx){a=x.a;return*this;intmain(){IntegerA(90),B(30),C;cout<<"A=";A.display();cout<<"B=";B.display();C=A+B;cout<<"C=A+B=";C.display();C=A-B;cout<<"C=A-B=";C.display();C=A*B;cout<<"C=A*B=";C.display();C=A/B;cout<<"C=A/B=";C.display();}11.使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看做由圆继承而来,所以可以把圆类Circle作为基类。在Circle类中定义一个数据成员radius和两个虚函数area和volume。由Circle类派生Sphere类和Column类。在派生类中对虚函数area和volume重新定义,分别求球体和圆柱体的体积及表面积。【解答】#include<iostream>usingnamespacestd;constdoublePI=3.14159265;classcircle{public:circle(doubler){radius=r;}virtualdoublearea(){return0.0;}virtualdoublevolume(){return0.0;}protected:doubleradius;};classsphere:publiccircle{public:sphere(doubler):circle(r){}doublearea(){return4.0*PI*radius*radius;}doublevolume(){return4.0*PI*radius*radius*radius/3.0;}};classcolumn:publiccircle{public:column(doubler,doubleh):circle(r){height=h;}doublearea(){return2.0*PI*radius*(height+radius);}doublevolume(){returnPI*radius*radius*height;}private:doubleheight;};intmain(){circle*p;spheresobj(2);p=&sobj;cout<<"球体:"<<endl;cout<<"体积="<<p->volume()<<endl;cout<<"表面积="<<p->area()<<endl;columncobj(3,5);p=&cobj;cout<<"圆柱体:"<<endl;cout<<"体积="<<p->volume()<<endl;cout<<"表面积="<<p->area()<<endl;}12.某学校对教师每月工资的计算规定如下:固定工资+课时补贴。教授的固定工资为5000元,每个课时补贴50元。副教授的固定工资为3000元,每个课时补贴30元。讲师的固定工资为2000元,每个课时补贴20元。定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。【解答】#include<iostream>usingnamespacestd;classteacher{public:teacher(chartname[],inttime){strcpy(name,tname);coursetime=time;}virtualintpay()=0;virtualvoidprint()=0;char*getname(){returnname;}intgetcoursetime(){returncoursetime;}protected:charname[30];intcourseti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 图书管理系统java课程设计报告
- 服装课程设计学习
- 提高班篮球教学课程设计
- 本溪茶艺课程设计
- 泰勒课程设计五原则
- 电子政务系统建设与维护合同
- 区块链智能投顾技术服务合作合同
- 人力资源管理系统咨询服务合同
- 云平台技术研发服务合同3篇
- 农民工工资委托代发协议3篇
- 铝锭购销合同铝锭销售合同2024年
- Unit 7 Careers Writing Workshop 申请信讲解 教学设计-2023-2024学年高中英语北师大版2019 选择性必修第三册
- 医药行业药品配送优化服务方案
- 广东省深圳市红岭中学2023-2024学年七年级上学期分班考试语文试题(解析版)
- 2024年新苏教版五年级上册科学全册知识点
- Byk助剂说明手册
- 建筑施工企业增值税留抵税额形成原因及对策建议
- 2024新外研版初一上英语单词默写表
- 2024年安全员-C证考试题库及答案(1000题)
- DL-T5181-2017水电水利工程锚喷支护施工规范
- 申请线上开庭申请书
评论
0/150
提交评论