第八章问题多态性、运算符重载、纯虚函数、抽象类.doc_第1页
第八章问题多态性、运算符重载、纯虚函数、抽象类.doc_第2页
第八章问题多态性、运算符重载、纯虚函数、抽象类.doc_第3页
第八章问题多态性、运算符重载、纯虚函数、抽象类.doc_第4页
第八章问题多态性、运算符重载、纯虚函数、抽象类.doc_第5页
免费预览已结束,剩余1页可下载查看

下载本文档

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

文档简介

多态性、运算符重载、纯虚函数、抽象类83 练习题 1什么是多态性?为什么说它是面向对象程序设计的一个重要机制? 2函数重载的含义是什么?定义重载函数时应注意些什么问题? 3运算符重载的含义是什么?是否所有的运算符都可以重载? 4运算符重载有哪两种形式?这两种形式有何区别? 5运算符重载函数使用关键字con st说明后,是指什么不可改变? 6静态联编和动态联编的区别是什么? 7什么是虚函数?为什么要定义虚函数?它与动态联编有何关系? 8什么是纯虚函数?什么是抽象类? 9虚析构函数有什么作用? 10总结C+语言的多态性包含哪些内容?84 作业题一、选择填空对定义重载函数的下列要求中。( )是错误的A要求参数的个数不同B要求参数中至少有一个类型不同C要求参数个数相同时。参数类型不同D要求函数的返回值不同2.下列函数中,( ) 不能重载。A成员函数 B非成员函数 C析构函数 D构造函数 3下列对重载函数的描述中,( )是错误的。 A重载函数中不允许使用默认参数 B重载函数中编译系根据参数表进行选择 C不要使用重载函数来描述毫无相干的函数 D构造函数重载将会给初始化带来多种方式 4下列运算符中,( )运算符不能重载。 A & B C : D new 5下列关于运算符重载的描述中,( )是正确的。 A运算符重载可以改变操作数的个数 B运算符重载可以改变优先级 C运算符重载可以改变结合性 D运算符重载不可以改变语法结构。 6运算符重载函数是( )。 A成员函数 B友元函数 C内联函数 D带默认参数的函数 7关于动态联编的下列描述中,( )是错误的。 A动态联编是以虚函数为基础的 B动态联编是在运行时确定所调用的函数代码的 C动态联编调用函数操作是用指向对象的指针或对象引用 D动态联编是在编译时确定操作函数的 8关于虚函数的描述中,( )是正确的。 A虚函数是一个static类型的成员函数 B虚函数是一个非成员函数 C基类中说明了虚函数后,派生类中将其对应的函数可不必说明为虚函数D.派生类的虚函数与基类的虚函数具有不同的参数个数和类型9关于纯虚函数和抽象类的描述中,( )是错误的。 A纯虚函数是一种特殊的虚函数,它没有具体的实现 B抽象类是指具有纯虚函数的类 C一个基类中说明有纯虚函数,该基类的派生类一定不再是抽象类 D抽象类只能作为基类来使用,其纯虚函数的实现由派生类给出 10下列描述中,( )是抽象类的特性。 A可以说明虚函数 B可以进行构造函数重载 C可以定义友元函数 D不能说明其对象 二、判断下列描述的正确性,对者划,错者划1函数的参数个数和类型都相同,只是返回值不同,这不是重载函数。2重载函数可以带有默认值参数,但是要注意二义性。3多数运算符可以重载,个别运算符不能重载,运算符重载是通过函数完现的。4对每个可重载的运算符来讲,它既可以重载为友元函数,又可以重载为成员函数,还可以重载为非成员函数。5对单目运算符重载为友元函数时,说明一个形参;重载为成员函数时,j式说明形参。6重载运算符保持原运算符的优先级和结合性不变。7虚函数是用virtual关键字说明的成员函数。8构造函数说明为纯虚函数是没有意义的。9抽象类是指一些没有说明对象的类。10动态联编是在运行时选定调用的成员函数的。 三、分析下列程序的输出结果 1 #includeinostram.h class Bpublic: B(int i)b=i+50; show(); B()Virtual void show( ) cout”B:show()called”bendl;Protected: int b:class D:public BPublic: D(int i):B(t) di十100;show(); D() void show()cout”DC:show(0 called.”dendl;protected:int d:; void main() D d1(108); 分析: 该程序中定义了B类和D类两个类。其中,D类是公有继承B类的派生类。在主函数中,仅创建一个D类对象d1,于是调用D类的构造函数,先调用基类B的构造函数,给数据成员b初始化,又调用B类的show()函数,输出显示如下信息。 B:show(0 called.158接着执行派生类D的构造函数体,给数据成员d初始化,又调用D类的show()函数,输出显示如下信息。 D:show(0 called.208 请读者思考。将B类中show()函数说明为virtual函数时,输出结果会有变化吗?再将D类继承B类的方式改为私有,输出结果会有变化吗?为什么?2#include class B public: B() B(int i)b=i;Virtual void virfun( )cout”B:virfun()calledn”;private: int b;class D:public B public: D() D(int i,int j):B(i)dj;) Prtvate: int d; void virfun()cout”D:virfun()calledn”;;void fun(B*obj)obj一virfun();void main() D * pdnew D;fun(pd); 分析: 该程序中,定义了派生类D公有继承基类B,基类B中说明了非静态成员函数virfun()为虚函数在派生类D中对它进行了重新定义。在一般函数fun()中,通过对象指针来调用虚函数,于是实现了动态联编,输出显示上述结果。 请读者思考下列问题。 (1)将一般函数fun()的形参改为D类的对象,并做相应修改后,输出结果会改变吗?为什么? (2)仅将B类中virfun()函数前边virtual关键字去掉,其余不变,输出结果会改变吗?为什么? (3)仅将D类继承B类的方式改为私有,其余不变,编译该程序时会出现什么错误?为什么? 3 材includeiostream。hClass A public: A()verA; void print() cout”The A version”verendl; protected:Char ver;class D1:public A public:D1(int number) infonumber; ver=1;void print()cout”The D1 info:”info”version”verendl; private: int info;class D2:public A public: D2(int number) infonumber; void print( ) cout”The D2 info:”info”version”verendI; private:int info;class D3:public D1 publjc:D3(int number):D1(number) info:number;ver=3; void print() cout”The D3 info :”info”version”verendl; prnvate: int info;void Print_info(A *p) p一print();void main() A a; D1 d1(4); D2 d2(100); D3 d3(一25); print_info(&a); print_info(&d1); print_info(d2); print_info(& d3); 分析: 该程序中,定义一个基类A,又定义两个派生类D1和D2,它们公有继承基类A.又定义一个派生类D3,它公有继承Dl类。定义一个一般函数罗print_info(),它的形参是指向对象的指针。主函数中定义了4个类的4个对象,并用它们的地址值

温馨提示

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

评论

0/150

提交评论