C网络作业6答案_第1页
C网络作业6答案_第2页
C网络作业6答案_第3页
C网络作业6答案_第4页
C网络作业6答案_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

作业4之青柳念文创作一、选择题1.以下对于动向联编的描述中,错误的选项是_________.D动向联编是以虚函数为基础的动向联编是在运转时确立所调用的函数代码的动向联编调用函数操控是指向对象的指针或对象引用D)动向联编是在编译时确立操控函数的注:先期联编也称静态联编,迟后联编也称动向联编.说明:动向联编向来要到程序运转时才华确立调用哪一个函数.虚函数是实现动向联编的需要条件之一.没有虚函数必定不克不及实现动向联编,但有虚函数存在时,一定同时满足以下条件,才华够实现动向联编:●类之间满足子种类关系;●调用虚函数操控的是指向对象的指针或许对象引用:或许是由成员函数调用虚函数.2对于虚函数的描述中,正确的选项是________.D虚函数是一个静态成员函数虚函数是一个非成员函数虚函数既能够在函数说明时定义,也能够在函数实现时定义派生类的虚函数与基类中对应的虚函数拥有相同的参数个数和类型说明:虚函数是非静态的成员函数.它不克不及是友元函数,但能够在此外一个类中被申明为友元函数.虚函数申明只好出此刻类定义的函数原型申明中,而不克不及在成员函数的函数体实现的时候.派生类的虚函数与基类中对应的虚函数一定满足以下条件,不然派生类中的虚函数将丢掉其虚特征,在调用时停止静态联编:●派生类中的虚函数与基类中的虚函数拥有相同的称呼:●派生类中的虚函数与基类中的虚函数拥有相同的参数个数和相同的对应参数种类:●派生类中的虚函数与基类中的虚函数的返回值或许相同,或许都返回指针或引用,并且派生类虚函数所返回的指针或引用的基种类是基类中的虚函数所返回的指针或引用的基种类的子种类.在下边四个选项中,________是用来申明虚函数的.AA)virtualB)publicC)usingD)false说明:说明虚函数的一般格式以下:virtua1<函数返回种类><函数名>(<参数表>)对虚函数的调用________.D必定使用动向联编B)一定使用动向联编C)必定使用静态联编D)纷歧定使用动向联编说明:拜会第1题的说明.实现运转时的多态性要使用___________.DA)重载函数B)结构函数C)析构函数D)虚函数说明:拜会第1题的说明.要实现动向联编,一定经过____调用虚函数.AA)对象指针B)成员名限制C)对象名D)派生类名说明:拜会第1题的说明.7在派生类中从头定义虚函数时,除了_____方面,其余方面都一定与基类中相应的虚函数坚持一致.DA)参数个数B)参数种类C)函数称呼D)函数体说明:拜会第2题的说明.8下边对于结构函数和析构函数的描述,错误的选项是__.D析构函数中调用虚函数采纳静态联编对虚析构函数的调用能够采纳动向联编当基类的析构函数是虚函数时,其派生类的析构函数也必定是虚函数结构函数能够申明为虚函数说明:结构函数不克不及申明为虚函数,但析构函数能够申明为虚函数.当基类的析构函数申明为虚函数时,不论派生类能否使用virtual重点字说明,派生类的析构函数必定是虚函数,对缺省析构函数亦然.并且,假如满足动向联编的其余条件,对虚析构函数的调用将采纳动向联编.结构函数不克不及申明为虚函数,但在结构函数中能够调用虚函数.在结构函数或析构函数中调用虚函数,将采纳静态联编.9对于纯虚函数和抽象类的描述中,错误的选项是__.C纯虚函数是一种特别的虚函数,它没有详尽的实现抽象类是指拥有纯虚函数的类C)一个基类中说明有纯虚函数,该基类的派生类必定不再是抽象类D)抽象类只好作为基类来使用,其纯虚函数的实现由派生类给出说明:带有纯虚函数的类称为抽象类.抽象类中的纯虚函数的实现由派生类给出:但派生类仍可不给出纯虚函数的定义,持续作为抽象类存在.以下描述中,____是抽象类的特征.D能够说明虚函数B)能够停止结构函数重载能够定义友元函数D)不克不及说明其对象说明:抽象类差别于其余类的最根本的特点是不克不及定义对象11_______是一个在基类中说明的虚函数,它在该基类中没有定义,

.但要求任何派生类都一定定义自己的版本.CA)虚析构函数B)虚结构函数C)纯虚函数D)静态成员函数12假如一个类起码有一个纯虚函数,那末就称该类为__.AA)抽象类B)虚基类C)派生类D)以上都分歧错误以下___成员函数示意纯虚函数.CA)virtualintvf(int);B)voidvf(int)=0;C)virtualvoidvf( )=0;D)virtualvoidvf(int)( )说明:纯虚函数的申明格式以下:virtual<函数返回种类><函数名>(<参数表>)=0;注意纯虚函数与虚函数体为空的差别.纯虚函数根本就没有函数体,而空的虚函数的函数体为空:前者所在的类是抽象类,不克不及直接停止实例化,尔后者所在的类是能够实例化的:下边的描述中,正确的选项是_____.AA)virtual能够用来申明虚函数含有纯虚函数的类是不能够用来创立对象的,因为它是虚基类即便基类的结构函数没有参数,派生类也一定成立结构函数静态数据成员能够经过成员初始化列表来初始化说明:virtual重点字既能够用来申明虚基类,也能够用来申明虚函数.含有纯虚函数的类是抽象类,它不克不及用来定义对象.静态数据成员的初始化一定在类体外停止.假如全部的基类和子对象结构函数都不需要参数,派生类也不需要参数时,派生类结构函数能够不定义.在下边程序中,A、B、C、D四句编译时不会出现错误的选项是__.A#include<iostream.h>classBase{public:Base( ){}Base(intc):count(c){}virtualvoidprint( )const=0;private:intcount;};classDerived:publicBase{public:Derived( ):Base(0){}Derived(intc):Base(c){}voidprint( )const{cout<<"Derived"<<endl;}};voidmain( ){Derivedd(10);Base*pb;Base&cb=d;Deriveddd=*pb;Derived&cd=cb;Basebb=d;}

//C//D说明:B和C处不切合赋值兼容规则.D处犯错是因为函数的抽象类,不克不及成立抽象类的对象.

Base是含有纯虚在下边程序中,A,B、C、D四句编译时出现错误的选项是___.CclassA{

//Apublic:

//BA( ){func( );}

//Cvirtualvoidfunc( )=0;

//D};说明:结构函数中不克不及调用纯虚函数,但能够调用虚函数17剖析下边的程序,正确的输出成就是___B#include<iostream.h>#include<string.h>classBase{

.public:virtualchar*fun( )const=0;}char*Base::fun( )const{returnclassDerivedl1:virtualpublicBase{

“Base”;}public:char*fun( )const{return"Derived11";}};classDerivedl2:virtualpublicBase{public:char*fun( )const{return"Derivedl2";}};classDerived2:publicDerivedl1,publicDerivedl2{public:char*fun( )const{char*ptr;ptr=newchar[strlen(Derivedl1::fun( ))+strlen(Derivedl2::fun( ))+l];strcpy(ptr,Derived11::fun( )),strcat(ptr,Derived12::fun( ));returnptr;}};voidmain( ){Base*pb;pb=newDerived11;cout<<pb->fun( )<<endl;pb=newDerivedl2;cout<<pb->fun( )<<endl;pb=newDerived2;cout<<pb->fun( )<<endl;}A)BaseBaseBaseC)

B)Derivedl1Derivedl2Derivedl1Derivedl2D)Derivedl1Derivedl2Derivedl1Derivedl2Derivedl1Derivedl2Derivedl1Derivedl2说明:拜会第1题、第2题的说明.派生类Derivedll、Derivedl2和Derived2中的函数fun与基类Base中的虚函数fun的函数名、参数表和返回种类都完好相同,因此这三个类中的fun函数也是虚函数,对fun函数的调用采纳动向联编.二、填空题动向联编中直到_①程序运转_时才华确立调用哪一个函数;而静态联编则是在_②程序编译时停止的.说明:动向联编与静态联编的观点.静态联编所支持的多态性称为_①编译时的_多态性,动向联编所支持的多态性则称为__②运转时的__多态性,动向多态性由_③虚函数____来支持.说明:在C++中,多态性的实现和联编相关.3对虚函数使用对象指针或引用调用,系统使用

__①动向

__联编;使用对象调用时.系统使用__②静态__联编.说明:拜会选择填空第1题、第5题的说明.动向联编是在__①虚函数___的支持下实现的,它经过_②指针或引用来调用该函数操控.5在一个成员函数内调用一个虚函数时,对该虚函数的调用停止__动态_____联编.6在析构函数中调用虚函数时,采纳___静态_____联编.C++中__①不支持___虚结构函数,但___②支持___虚析构函数.说明:拜会选择填空第8题的说明.多态是分歧的对象对同一信息有分歧的行为特点,虚函数作为运转过程中多态的基础,主假如针对对象的,而结构函数的调意图味着要成立一个对象,这时一定切实地知道这个对象的种类,并且,我们也不会为一个已存在的对象调用结构函数.所以,虚结构函数没存心义.在C++中能够申明虚析构函数.析构函数的功能是在该类对象消亡以前停止一些需要的清理工作,假如一个类的析构函数是虚函数,那末,由它派生而来的全部子类的析构函数也是虚函数.析构函数设置为虚函数后,在使用指针调用时能够停止动向联编,实现运转时的多态,进而担保使用基类的指针就能够够调用适合的析构函数针对分歧的对象停止清理工作.在类定义中,将__=0__置于虚函数的函数原型的末端能够将该函数申明为纯虚函数带有_①纯虚函数_的类称为抽象类,它只好作为_②基类_来使用.说明:抽象类的作用主要有两个:直接用作基类或用作指针或引用的基种类.抽象类不克不及__①定义对象__,但能够__②申明抽象类的指针或引用__作为参数种类,函数返回种类或显式变换种类.说明:注意抽象类不克不及定义对象是指不克不及定义需要分派储存空间的对象.所以能够申明抽象类的指针或引用,它们在程序运转时能够指向并接见派生类对象.以下程序的运转成就以下:Derivel'sPrint( )called.Derive2'sPrint( )called.依据成就将程序赔偿完好.#include<iostream.h>classBase{public:Base(inti){b=i;}___①virtualvoidPrint( )=0;___protected:intb;};classDerivel:publicBase{public:___②Derive1(inti):Base(i){}voidPrint( )

___{cout<<”Derive1

’sPrint( )called.

”<<endl;}};classDerive2:publicBase{_③public:Derive1(inti):Base(i){}voidPrint( ){cout<<”Derive2endl;}_____};voidfun(_④Base*obj__){obj->Print( );

’s

Print(

)

called.

“<<}voidmain( ){_⑤Derive1*d1=newDerive1(1);_Derive2*d2=newDerive2(2);fun(dl);fun(d2);}说明:派生类Derived1和Derived2从基类Base公有继承,它们是Base的子种类.主程序中两次调用fun函数,该函数经过指针对象obj调用了Print函数,获得了分歧的输出成就.而相同的信息被分歧种类的对象采纳时致使完好分歧的行为,恰巧表现了面向对象的多态特征.依据运转时的多态一定满足的条件,Print函数一中的

定是一个虚函数,并且在全部类中都一定停止定义Print函数除

.

因为

Base

类了供给一个公共的接口外,没有其余的作用,所以最好定义为纯虚函数.12将以下程序赔偿完好.#include<iostream.h>classconvert{public:convert(doublei){vail=i;}_①virtualvoidcompute( )=0;protected:doubleval1;doubleval2;};//literstogallonsclassl_to_g:publicconvert{

___public:__②l_to_g(doublei):convert(i){}voidcompute( )

_{val2=val1/3.7854;cout<<val1<<"litersis"<<val2<<"gallons."<<endl;}};//FahrenheittoCelsiusclassf_to_c:publicconvert{_

③public:f_to_c(doublei):convert(i){}voidcompute( ){val2=(val1-32)*5/9;cout<<val1<<

”Fahrenheit

is“<<val2<<”Celsius.}

”<<endl;};voidfun(__

④convert&f

_){pute( );}voidmain( ){l_to_glgobj(4);f_to_cfcobj(70);fun(lgobj);fun(fcobj);}13依据分歧的输出成就,在函数Tone中填入正确的语句.#include<iostream.h>classInstrument{public:virtualvoid

Print( )

const{cout<<"Instrument::Print"<<endl;}};classPiano:publicInstrument{public:voidPrint( )const{cout<<"Piano::Print"<<endl;}};classGuitar:publicInstrument{public:voidPrint( )const{cout<<"Guitar::Print"<<endl;}};voidTone(_____①_____){___②_____}voidmain( ){Guitarg;Tone(g);Pianop;Tone(p);}输出成就为:Instrument::PrintInstmment::Print(2)输出成就为:Guitar::PrintPiano::Print(1)①

Instrumentobj

②obj.Print( )(2)①

Instrument&obj

②obj.Print( )参照第3题,第一次的输出是由静态联编发生的,第二次的输出是由动向态联编发生的.以下程序的运转成就以下:Base'scons.Derived'scons.Derived'sdes.Base'sdes.依据成就将程序赔偿完好.#include<iostream.h>classBase{public:Base( ){cout<<"Base'scons."<<endl;}_①virtual~Base( )_{cout<<"Base'sdes."<<endl;}};classDerived:publicBase{public:Derived( ){cout<<"Derived'scons."<<endl;}~Derived( ){cout<<"Derived'sdes."<<endl;}};voidmain( ){Base*ptr=_____②newDerived______deleteptr;}三、编程1.在作业1编程1的Point类中达成赋值运算符=、拔出运算符<<、比较运算符==、!=和加法运算符+、-的重载.#include<math.h>#include<iostream.h>classPoint{public:Point(floatx=0,floaty=0,floatz=0):x_(x),y_(y),z_(z){}Point(constPoint&p):x_(p.x_),y_(p.y_),z_(p.z_){}形参point为常引用,它所引用的对象不克不及被更新,即传给它的实参不克不及被更新.voidnegate( ){x_*=-1;y_*=-1;z_*=-1;}doublenorm( ){returnsqrt(x_*x_+y_*y_+z_*z_);}voidprint( ){cout<<'('<<x_<<","<<y_<<","<<z_<<")";}Point&operator=(constPoint&point);boolPoint::operator==(constPoint&point)const常成员函数,只有它才有资格操控常量和常对象{returnx_==point.x_&&y_==point.y_&&z_==point.z_;}boolPoint::operator!=(constPoint&point)const{returnx_!=point.x_||y_!=point.y_||z_!=point.z_;}friendPointoperator+(constPoint&p1,constPoint&p2);friendPointoperator-(constPoint&p1,constPoint&p2);friendostream&operator<<(ostream&ostr,constPoint&point);private:floatx_,y_,z_;};Pointoperator+(constPoint&p1,constPoint&p2){returnPoint(p1.x_+p2.x_,p1.y_+p2.y_,p1.z_+p2.z_);}{returnPoint(p1.x_-p2.x_,p1.y_-p2.y_,p1.z_-p2.z_);}ostream&operator<<(ostream&ostr,constPoint&point){returnostr<<"("<<point.x_<<","<<point.y_<<","<<point.z_<<")";}{x_=point.x_;y_=point.y_;z_=point.z_;return*this;}voidmain( ){Pointp(12,-3,4),q(14,5,12),r1,r2;r1=p+q;cout<<r1<<r1.norm( )<<endl;r2=p-q+r1;cout<<r2<<r2.norm( )<<endl;if(r1==r2)cout<<"r1==r2"<<endl;elsecout<<"r1!=r2"<<endl;}2.假定Point类的坐标为整型,对它重载++(自增)、--(自减)运算符(包括前后缀).#include<math.h>#include<iostream.h>classPoint{public:Point(intx=0,inty=0,intz=0):x_(x),y_(y),z_(z){}Point(constPoint&p):x_(p.x_),y_(p.y_),z_(p.z_){}Point&operator++( ){x_++;y_++;z_++;return*this;}为何要返回引用,以下代码行吗?//Pointoperator++( )//{x_++;y_++;z_++;return*this;//}{Pointtemp(*this);x_++;y_++;z_++;returntemp;}Point&operator--( ){x_--;y_--;z_--;return*this;}Pointoperator--(int){Pointtemp(*this);x_--;y_--;z_--;returntemp;}voidprint( ){cout<<'('

温馨提示

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

评论

0/150

提交评论