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; };。
多态性与虚函数
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.实验五第三题。