c++多态性与虚函数习题答案
- 格式:doc
- 大小:20.50 KB
- 文档页数:2
练习题11.1 判断题×1.C++语言和C语言都是面向对象的程序设计语言。
√2.面向对象方法具有封装性、继承性和多态性。
√3.C语言是C++语言的一个子集。
C++语言继承了C语言。
×4.C++语言程序与C语言程序一样都是函数串。
×5.C++语言支持封装性和继承性,不支持多态性。
√6.C++语言比C语言对数据类型要求更加严格了。
√7.C++语言对C语言进行了一次改进,使得编程更加方便了。
×8.C++源程序在编译时可能出现错误信息,而在连接时不会出现错误信息。
√9.编译C++源程序时,出现了警告错(Warning)也可以生成可执行文件。
√10.C++语言程序的实现也要经过编辑、编译连接和运行3个步骤。
1.2 单选题1.下列关于面向对象概念的描述中,错误的是(C )。
A.面向对象方法比面向过程方法更加先进B.面向对象方法中使用了一些面向过程方法中没有的概念C.面向对象方法替代了结构化程序设计方法D.面向对象程序设计方法要使用面向对象的程序设计语言2.下列各种高级语言中,不是面向对象的程序设计语言是(D )。
A.C++ B.JavaC.VB D.C3.下列关于类的描述中,错误的是( A )。
A.类就是C语言中的结构类型B.类是创建对象的模板C.类是抽象数据类型的实现D.类是具有共同行为的若干对象的统一描述体4.下列关于对象的描述中,错误的是(C )。
A.对象是类的一个实例B.对象是属性和行为的封装体C.对象就是C语言中的结构变量D.对象是现实世界中客观存在的某种实体5.下列关于C++程序中使用提取符和插入符的输入/输出语句的描述中,错误的是(C )。
A.提取符是对右移运算符(>>)重载得到的B.插入符是对左移运算符(<<)重载得到的C.提取符和插入符都是双目运算符,它们要求有两个操作数D.提取符和插入符在输入/输出语句中不可以连用1.3 填空题1.C++语言具有面向对象方法中要求的三大特性:封装性、继承性和多态性。
多态性与虚函数习题一、选择题1.在C++中,用于实现运行时多态性的是()。
A)内联函数B)重载函数C)模板函数D)虚函数2.如果一个类至少有一个纯虚函数,那么就称该类为()。
(a)抽象类 (b)派生类 (c)虚基类 (d)以上都不对3.为了区分一元运算符的前缀和后缀运算,在后缀运算符进行重载时,额外添加一个参数,其类型是()。
(a)void (b)char (c)int (d)float4.下列关于抽象类的说明中不正确的是()。
(a)含有纯虚函数的类称为抽象类(b)抽象类不能被实例化,但可声明抽象类的指针变量(c)抽象类的派生类可以实例化(d)纯虚函数可以被继承5.运行下列程序的输出结果为()。
#include<iostream.h>class base{public:void fun1(){cout<<"base"<<endl;}virtual void fun2(){cout<<"base"<<endl;}};class derived:public base{public:void fun1(){cout<<"derived"<<endl;}void fun2(){cout<<"derived"<<endl;}};void f(base &b){b.fun1();b.fun2();}int main(){derived obj;f(obj);return 0;}(a)base (b)base (c)derived (d)derivedBase derived base derived6.下面描述中,正确的是()。
A.virtual可以用来声明虚函数B.含有纯虚函数的类是不可以用来创建对象的,因为它是虚基类C.即使基类的构造函数没有参数,派生类也必须建立构造函数D.静态数据成员可以通过成员初始化列表来初始化7. 关于虚函数的描述中,正确的是()。
二级C++笔试353(总分100, 做题时间90分钟)一、选择题下列各题A) 、B) 、C) 、D) 四个选项中,只有一个选项是正确的。
1.静态成员函数不能说明为SSS_SINGLE_SELA 整型函数B 常函数C 虚函数D 内联函数分值: 2答案:C[解析] 静态函数不能说明为虚函数。
2.以下程序的输出结果为main()int m=7,n=4;float a=38.4,b=6.4,x;x=m/2+n*a/b+1/2;cout<<x<<end1;}SSS_SINGLE_SELA 27.000000B 27.500000C 28.000000D 28.500000分值: 2答案:A[解析] 本题考查表达式值的类型由参与运算的所有变量的类型中优先级最高的变量类型所决定。
不过要注意的是整型向float型转换时.将丢失小数部分,即向下驭值。
3.关于虚函数的描述中正确的是SSS_SINGLE_SELA 虚函数是一个静态成员函数B 虚函数是一个非成员函数C 虚函数既可以在函数说明时定义,也可以在函数实现时定又D 派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型分值: 2答案:D[解析] 虚函数不能定义为静态函数;虚函数的作用在于继承,表现出动态性。
所以,在派生类中定义的虚函数必须和基类中对应的虚函数具有相同的参数个数和类型。
4.若有说明:int a [3][4];则对a数组元素的非法引用是SSS_SINGLE_SELA a[0][2*1]B a[1][3]C a[4-2][0]D a[0][4]分值: 2答案:D[解析] 在数组这部分的知识里面,数组下标越界是一个比较容易忽略的问题,其下标是从。
开始,至n-1为止,因此选项D是正确答案。
5.静态成员函数没有SSS_SINGLE_SELA 返回值B this指针C 指针参数D 返回类型分值: 2答案:B[解析] this指针是系统隐含的用于指向当前对象的指针。
VC++程序设计试题〔B〕一、单项选择〔每题分,10小题,共15分〕1.以下不属于面向对象程序设计的3大机制的是〔〕A.多态 C.重载 D.继承2、关于对象,以下说法中不正确的选项是〔〕A.对象是类的一个实例B. 一个类只能有一个对象C.任何一个对象只能属于一个类3、关于类的成员,以下正确的说法是〔〕C.数据成员和成员函数都可以为private public protect属性之一D.公有成员函数只能访问类的公有成员,私有成员函数只能访问类的私有成员4、要实现动态束定,必须通过〔〕调用虚函数。
A. 对象指针B.成员名限定C. 对象名D. 派生类名5、关于友元以下说法错误的选项是〔〕A.类的友元函数可以访问类的所有成员C.类A是类B的友元类,那么A的所有成员函数可访问B的任何成员6、MFC主要由〔〕组成A. 根底类库、全局函数B. 根底类库、全局变量、宏C.根底类库、宏D.根底类库、全局变量、全局函数、宏7、关于构造函数,以下说法不正确的选项是〔〕A.一个类中有且仅有一个构造函数B.构造函数在说明类变量时被自动执行C.构造函数没有返回值D.类中的构造函数的函数名与该类的类名必须同名8、程序对资源的调用主要是靠〔〕来识别。
A.资源名称9、在一个GDI对象使用完后,通常应当调用〔〕函数将其从设备描述符表别离出来,再将其删除,以免造成系统资源的浪费。
A. Attach()B.ReleaseDC()C.Detach()D.DeleteDC()10、使用GetWindowDC()和GetDC()获取的设备描述符表,在退出时必须调用〔〕来释放。
A.ReleaseDC()B.Delete()C.DeleteDC()D.Detach()二、判断题〔每题1分,10小题,共10分〕1.类实现了数据的封装。
〔〕2.一个类一定有构造函数和析构函数。
〔〕3.友元函数是类的成员函数。
〔〕4.析构函数可以重载。
〔〕5.析构函数没有返回值类型。
第9章习题一、概念题1. 解答要点如下。
多态是指同样的消息被不同类型的对象接收时导致完全不同的行为,是对类的特定成员函数的再抽象。
C++支持的多态有多种类型,重载(包括函数重载和运算符重载)和虚函数是其中主要的方式。
2. 解答要点如下。
含有纯虚函数的类称为抽象类。
抽象类的主要作用是通过它为一个类族建立一个公共的接口,使它们能够更有效地发挥多态特性。
抽象类声明了一组派生类共同操作接口的通用语义,而接口的完整实现,即纯虚函数的函数体,要由派生类自己给出,抽象类只能作为基类被继承使用。
抽象类的派生类不一定要给出纯虚函数的实现,没有给出纯虚函数的实现的派生类仍然还是抽象类。
3. 解答要点如下。
在C++中不能声明虚构造函数。
多态是不同的对象对同一消息有不同的行为特性,虚函数作为运行过程中多态的基础,主要是针对对象的,而构造函数是在对象产生之前运行的,因此虚构造函数是没有童义的。
在C++中可以声明虚析构函数。
析构函数的功能是在该类对象消亡之前进行一些必要的清理工作,如果一个类的析构函数是虚函数,那么,由它派生而来的所有子类的析构函数也是虚函数。
析构函数设置为虚函数之后,在使用指针引用时可以动态联编,实现运行时的多态,保证使用基类的指针就能够调用适当的析构函数对不同的对象进行清理工作。
二、填空题1. 运行时2. 静态联编,动态联编3. public vehicle ,public vehicle4. 基类 A中的成员函数.派生类B中的成员函数.5. C类 B类6.抽象函数三、编程题1.#include<iostream.h>class Shape{public:virtual double GetArea()=0;};class Circle:public Shape{double radius;public:Circle(double r):radius(r){}double GetArea(){return 3.1416*radius*radius;}};class Square:public Rectangle{public:Square(double l):Rectangle(l,l){}};int main(){Rectangle r(3.5,4.0);Circle c(2.0);Square s(5.0);cout<<r.GetArea()<<endl;cout<<c.GetArea()<<endl;cout<<s.GetArea()<<endl;return 0;}2.#include <iostream.h>#include <string.h>class Computer{protected:char CPU[20],HDisk[20],Mem[20];public:Computer(char c[],char h[],char m[]){strcpy(CPU,c);strcpy(HDisk,h);strcpy(Mem,m);}virtual void Show(void){cout<<"CPU:"<<CPU<<'\t'<<"HDisk:"<<HDisk<<'\t'<<"Mem:"<<Mem<<endl;}};class PC:public Computer{private:char Display[20],Keyboard[20];public:PC(char c[],char h[],char m[],char d[],char k[]):Computer(c,h,m){strcpy(Display,d);strcpy(Keyboard,k);}void Show(void){cout<<"CPU:"<<CPU<<'\t'<<"HDisk:"<<HDisk<<'\t'<<"Mem:"<<Mem<<endl;cout<<"Display:"<<Display<<'\t'<<"Keyboard:"<<Keyboard<<endl;}};class NoteBook:public Computer{private:char LCD[20];public:NoteBook(char c[],char h[],char m[],char l[]):Computer(c,h,m){strcpy(LCD,l);}void Show(void){cout<<"CPU:"<<CPU<<'\t'<<"HDisk:"<<HDisk<<'\t'<<"Mem:"<<Mem<<endl;cout<<"LCD:"<<LCD<<endl;}};void main(void){PC pc("赛扬1G","Seagate40G","HY256MSDRAM","AOC15","美上美");NoteBook nb("P4/2G","金钻/80G(7200)","DDR/256M","飞利普107T/107F4");Computer *p;p=&pc;p->Show();p=&nb;p->Show();}3.class Computer{protected:char CPU[20],HDisk[20],Mem[20];public:Computer(char c[],char h[],char m[]){strcpy(CPU,c);strcpy(HDisk,h);strcpy(Mem,m);}virtual void Show(void)=0; };。
一、填空(每空2分,共20分)1.C++中ostream类的直接基类是__ios类____。
2.不同对象可以调用相同名称的函数,但可导致完全不同的行为的现象称为_多态性___。
3.定义虚函数所用的关键字是___virtual__。
4.将指向对象的指针作为函数参数,形参是对象指针,实参是对象的__地址值___。
5.作为语句的函数调用是通过___对函数的调用来执行函数体____来体现的。
6.执行if (x>=0||x<=0) cout<<"abcd";else cout<<"wxyz";屏幕上显示的是____abcd____。
7.设一维整型数组data已进行了初始化,则其元素个数可由操作符sizeof通过表达式____sizeof(data/data[0])___计算出来。
8.若一全局变量只允许本程序文件中的函数使用,则定义它时应加上修饰符____extern____。
9.设有int w[3][4];,pw是与数组名w等价的数组指针,则pw应初始化为_int(*pw)[4]=w;_。
10.要使引用pr代表变量char * p;,则pr应初始化为_char*&pr=p;_。
二、单项选择题(每空2分,共20分)1.对C++语言和C语言的兼容性,描述正确的是()A C++兼容CB C++部分兼容C C C++不兼容CD C兼容C++2.在C++中使用流进行输入输出,其中用于屏幕输出的对象是()A.cerr B.cin C.cout D.cfile3.下列()是正确的语句。
A ;B a=17C x+yD cout<<"\n"4.循环while(int i=0) i--;执行次数是()。
A 0B 1C 5D 无限5.设int f(int);和int g(int);是函数f和g的原形,以下将f作为语句调用的是()。
第9章多态性和虚函数的使用一、选择题1.C. 2.C 3.A 4.C 5. 6.D二、程序题(略)三、简答题1.C++多态性主要体现在哪两个方面?答:在C++中,多态性是指系统调用同名的函数,实现不同的功能。
多态性包含静态多态性和动态多态性。
静态多态性体现在编译时函数重载或者运算符重载上;展现了同一类中多个同名函数的处理机制。
而动态多态性是指程序运行过程中通过虚函数动态地确定针对的对象,展现继承层次结构中同名函数的处理机制。
2. 比较函数重载和虚函数在概念上和使用方式有什么区别。
函数重载是指函数名称相同,但是参数的个数或者参数的数据类型不同。
因此,系统调用重载函数时,会依据参数确定调用哪一个。
而在继承的机制中,基类的成员函数可能会与派生类新增的成员函数同名,包括参数个数和参数类型,这种现象不属于函数重载。
当基类的一个成员函数被声明为虚函数后,其派生类中的同名函数都自动成为虚函数。
派生类可以对虚函数重新定义。
虚函数实现动态多态的问题。
3.比较抽象类、虚函数、纯虚函数的概念和使用上的区别。
虚函数通常在基类中定义,定义可以是空,派生类中可以对虚函数重写,也可以不写。
虚函数起到了接口的默认行为作用。
纯虚函数在基类中是没有定义的,必须在直接或者间接派生类中加以实现,它起到了接口的作用。
包含了纯虚函数的类,被称为抽象类。
抽象类不能建立对象。
4.谈谈虚基类和虚函数,区分两者不同的概念和各自的作用。
在继承机制中,一个派生类继承多个直接基类,而这些基类又有一个公共的基类,这个公共的基类成员在继承中可能产生多个拷贝。
虚基类的基本原则是在内存中只有基类成员的一份拷贝。
这样,通过把基类继承声明为虚拟的,就只能继承基类的一份拷贝,从而消除歧义。
用virtual限定符把基类继承说明为虚拟的。
虚函数指基类中成员函数声明为 virtual ,使它在一个或多个派生类中被重新定义,虚函数的作用是实现多态性。
虚函数必须是基类的非静态成员函数,其访问权限可以protected或public。
国家计算机二级(C++)89(总分460, 做题时间120分钟)选择题(每小题2分,共70分) 下列各题四个选项中,有一个是正确的,请选择正确答案。
1.以下哪个基类中的成员函数表示纯虚函数?SSS_SINGLE_SELA virtual void vf(int)B void vf(int)=0C virtual void vf(=0)D virtual void yf(int){ }分值: 2答案:BC++中纯虚函数的定义与虚函数的关键字一样,在函数末尾要加上“=0”。
2.要想使23.78965421的输出为23.7887应用的语句是()。
SSS_SINGLE_SELA 一个子类的两个父类中都有某个同名成员,在子类中对该成员访问可能出现二义性B 解决二义性可以用对成员名的限定法C 父类和子类中同时出现同名函数,也可能存在二义性D 一个子类是从两个父类派生出来的,而这两个父类又有一个共同的父类,对该父类成员进行访问时,可能出现二义性分值: 2答案:C多线程不是同时执行几个事件,在某个时间上,计算机还是在执行一个事件,只是多线程将程序分为几个并行的子任务,由它们并发交叉执行。
在宏观上看,好像是同时执行几个事件。
3.数据库设计的根本目标是要解决______。
SSS_SINGLE_SELA 数据共享问题B 数据安全问题C 大量数据存储问题D 简化数据维护分值: 2答案:A由于数据的集成性使得数据可为多个应用所共享,特别是在网络发达的今天,数据库与网络的结合扩大了数据关系的应用范围。
数据的共享本身又可极大地减少数据冗余性,不仅减少了不必要的存储空间,更为重要的是可以避免数据的不一致性。
因此,数据库设计的根本目标是要解决数据共享问题。
4.已知枚举类型声明语句为: enum COLOR{WHITE,YELLOW,GREEN=5,RED,BLACK=10};则下列说法中错误的是SSS_SINGLE_SELA 枚举常量YELLOW的值为1B 枚举常量RED的值为6C 枚举常量BLACK的值为10D 枚举常量WHITE的值为1分值: 2答案:D枚举值是常量,不是变量。
习题3一、选择题1.在C++中,类与类之间的继承关系具有( C )A)自反性B)对称性C)传递性D)反对称性2.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B )A)受限制B)保持不变C)受保护D)不受保护3.按解释中的要求在下列程序划线处填入的正确语句是:( C )#include <iostream.h>class Base{public:void fun(){cout<<"Base::fun"<<endl;}};class Derived:public Base{public:void fun(){ //在此空格处调用基类的函数fun()cout<<"Derived::fun"<<endl;}};A)fun();B)Base.fun();C)Base::fun();D)Base->fun();4.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C )A)受限制B)保持不变C)受保护D)不受保护5.在哪种派生方式中,派生类可以访问基类中的protected 成员(B )A)public和private B)public、protected和privateC)protected和private D)仅protected6.当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)A) public成员B) private成员C) protected成员D) 友元7.不论派生类以何种方法继承基类,都不能使用基类的(B )A) public成员B) private成员C) protected成员D) public成员和protected成员8下面叙述错误的是(S )。
A)基类的protected成员在派生类中仍然是protected的B)基类的protected成员在public派生类中仍然是protected 的C)基类的protected成员在private派生类中是private的D)基类的protected成员不能被派生类的对象访问9.下列说法中错误的是(S )。
一、选择题1.在C++中,用于实现运行时多态性的是()。
A)内联函数B)重载函数C)模板函数D)虚函数2.如果一个类至少有一个纯虚函数,那么就称该类为()。
(a)抽象类(b)派生类(c)虚基类(d)以上都不对3.下列关于抽象类的说明中不正确的是()。
(a)含有纯虚函数的类称为抽象类(b)抽象类不能被实例化,但可声明抽象类的指针变量(c)抽象类的派生类可以实例化(d)纯虚函数可以被继承4.运行下列程序的输出结果为()。
class base{public:void fun1(){cout<<"base"<<endl;}virtual void fun2(){cout<<"base"<<endl;}};class derived:public base{public:void fun1(){cout<<"derived"<<endl;}void fun2(){cout<<"derived"<<endl;}};void f(base &b){b.fun1();b.fun2();}int main(){derived obj;f(obj);return 0;}(a)base (b)base (c)derived (d)derivedBase derived base derived二、填空题3.运行下列程序结果为_________________。
class one{public:virtual void f(){cout<<"1";}};class two:public one{public:two(){cout<<"2";}};class three:public two{public:virtual void f(){two::f();cout<<"3"; }};int main(){one aa,*p;two bb;three cc;p=&cc;p->f();return 0;}4.运行下列程序结果为_____________。
多态性与虚函数
1.概念填空题
1.1 C++支持两种多态性,分别是编译时和运行时。
1.2在编译时就确定的函数调用称为静态联编,它通过使用函数重载,模板等实现。
1.3在运行时才确定的函数调用称为动态联编,它通过虚函数来实现。
1.4虚函数的声明方法是在函数原型前加上关键字virtual。
在基类中含有虚函数,在派生类中的函数没有显式写出virtual关键字,系统依据以下规则判断派生类的这个函数是否是虚函数:该函数是否和基类的虚函数同名;是否与基类的虚函数参数个数相同、类型;是否与基类的虚函数相同返回类型。
如果满足上述3个条件,派生类的函数就是虚函数。
并且该函数覆盖基类的虚函数。
1.5 纯虚函数是一种特别的虚函数,它没有函数的函数体部分,也没有为函数的功能提供实现的代码,它的实现版本必须由派生类给出,因此纯虚函数不能是友元函数。
拥有纯虚函数的类就是抽象类类,这种类不能实例化。
如果纯虚函数没有被重载,则派生类将继承此纯虚函数,即该派生类也是抽象。
3.选择题
3.1在C++中,要实现动态联编,必须使用(D)调用虚函数。
A.类名
B.派生类指针
C.对象名
D.基类指针
3.2下列函数中,不能说明为虚函数的是(C)。
A.私有成员函数
B.公有成员函数
C.构造函数
D.析构函数
3.3在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(A)。
A.相同
B.不同
C.相容
D.部分相同
3.4当一个类的某个函数被说明为virtual时,该函数在该类的所有派生类中(A)。
A.都是虚函数
B.只有被重新说明时才是虚函数
C.只有被重新说明为virtual时才是虚函数
D.都不是虚函数
3.5(C)是一个在基类中说明的虚函数,它在该基类中没有定义,但要求任何派生类都必须定义自己的版本。
A.虚析构函数B.虚构造函数
C.纯虚函数D.静态成员函数
3.6 以下基类中的成员函数,哪个表示纯虚函数(C)。
A.virtual void vf(int);B.void vf(int)=0;
C.virtual void vf( )=0;D.virtual void vf(int){ }
3.7下列描述中,(D)是抽象类的特性。
A.可以说明虚函数
B.可以进行构造函数重载
C.可以定义友元函数
D.不能定义其对象
3.8类B是类A的公有派生类,类A和类B中都定义了虚函数func( ),p是一个指向类A对象的指针,则p->A::func( )将(A)。
A.调用类A中的函数func( )
B.调用类B中的函数func( )
C.根据p所指的对象类型而确定调用类A中或类B中的函数func( ) D.既调用类A中函数,也调用类B中的函数
编程题
1.实验八的第二题
2.定义一个Dog类。
要求其满足下述要求:该类包含等属性,以及对这些
属性操作的方法,并测试这个类。
(1) 要求有一个无参的构造函数,其初始的no、name、age值:1,金毛,
2。
(2) 要求有一个带参数的构造函数,其参数分别对应no、name、age。
(3) 要求用一个成员函数实现Dog的设置。
(4) 要求用一个成员函数实现输出Dog的信息。
(5) 要求用一个成员函数实现Dog信息的获取。
3.定义一个Dog 类,包含体重和年龄两个成员变量及相应的成员函数。
声
明一个实例dog1,体重为5,年龄为10,使用I/O 流把dog1 的状态写入磁盘文件。
再声明另一个实例dog2,通过读文件把dog1 的状态赋给dog2。
分别使用文本文件和二进制方式操作文件。
4.实验五第一题
5.实验五第二题
6.实验五第三题。