多态习题答案_第1页
多态习题答案_第2页
多态习题答案_第3页
多态习题答案_第4页
多态习题答案_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第八章多态1.单项选择题(1).以下关于运算符重载描述中,(D)是正确。(A)能够改变参加运算操作数个数 (B)能够改变运算符原来优先级(C)能够改变运算符原来结合性 (D)不能改变原运算符语义(2).以下函数中,不能重载运算符函数是(b)。(A)组员函数 (B)结构函数 (C)普通函数(D)友员函数(3).要求用组员函数重载运算符是(A)。(A)= (B)== (C)<= (D)++(4).要求用友员函数重载运算符是(C)。(A)= (B)[] (C)<< (D)()(5).在C++中,要实现动态联编,必须使用(D)调用虚函数。(A)类名 (B)派生类指针 (C)对象名 (D)基类指针(6).以下函数中,不能说明为虚函数是(C)。(A)私有组员函数 (B)公有组员函数 (C)结构函数 (D)析构函数(7).在派生类中,重载一个虚函数时,要求函数名、参数个数、参数类型、参数次序和函数返回值(A)。(A)相同 (B) 不一样 (C)相容 (D)部分相同(8).C++中,依照(D)识别类层次中不一样类定义虚函数版本。(A)参数个数 (B)参数类型 (C)函数名 (D)this指针类型(9).虚析构函数作用是(C)。(A)虚基类必须定义虚析构函数 (B)类对象作用域结束时释放资源(C) delete动态对象时释放资源 (D)无意义(10).下面函数原型中,(B)申明了fun为纯虚函数。(A)voidfun()=0;(B)virtualvoidfun()=0;(C)virtualvoidfun(); (D)virtualvoidfun(){};(11).若一个类中含有纯虚函数,则该类称为(C)。(A)基类 (B)纯基类 (C)抽象类 (D)派生类(12).假设Aclass为抽象类,以下正确说明语句是(B)。(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;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){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元。讲师固定工资为元,每个课时补助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]; intcoursetime;};classprofessor:publicteach

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论