1、二级 C+-112 及答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.有如下程序: #includeiostream using namespace std; class Basel public: Basel(int d) coutd; Base1() ; class Base2 public: Base2(int d) coutd; Base2() ; class Derived:public Base1,Base2 public: Derived(int a,int b,int c,int d); Base1(b),Base2(a),
2、b1(d),b2(c) Private: int b1; int b2; ; int main() Derived d(1,2,3,4); return 0; 运行时的输出结果是_。(分数:2.00)A.1234B.2134C.12D.212.己知基类 Employee 只有一个构造函数,其定义如下: Employee:Employee(int n):id(n) Manager 是 Employee 的派生类,则下列对 Manager 的构造函数的定义中,正确的是_。(分数:2.00)A.Manager:Manager(int n):id(n)B.Manager:Manager(int n)i
3、d=n;C.Manager:Manager(int n):Employee(n)D.Manager:Manager(int n)Employee(n);3.有如下程序: #includeiostream using namespace std; class A public: A()cout“A“; A()cout“C“; ; class B:public A public: B()cout“G“; B()cout“T“; ; int main() B obj; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.GATCB.AGTCC.GACTD.AGCT4.有如下程序:
4、#includeiostream using namespace std; class Base public: void fun()cout“B“;) ; class Derived:public Base public: void tun()_cout“D“; ; int main() Derived d; d.fun(); return 0; 若程序的输出结果是 BD,则划线处缺失的部分是_。(分数:2.00)A.fun();B.Base.fun();C.Base:fun();D.Base-fun();5.下列关于虚基类的描述中,错误的是_。(分数:2.00)A.使用虚基类可以消除由多继
5、承产生的二义性B.构造派生类对象时,虚基类的构造函数只被调用一次C.声明“class B:virtual public A”说明类 B 为虚基类D.建立派生类对象时,首先调用虚基类的构造函数6.有如下程序: #includeiostream using namespace std; class Mountain int height; public: Mountain(int h=0):height(h) virtual char* GetName()constreturn“山“; int GetHeight() constreturn height; ; class Lushan:publi
6、c Mountain Public: Lushan(int d):Mountain(d) Char* GetName()constreturn“庐山“; ; int main() Mountain *p=new Lushan(1000); coutp-GetName()“海拔“p-GetHeight()“米“; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.庐山海拔 1000 米B.庐山海拔 0 米C.山海拔 1000 米D.山海拔 0 米7.在 C+中,用于实现运行时多态性的是_。(分数:2.00)A.内联函数B.重载函数C.模板函数D.虚函数8.下列关于虚函数的说明
7、中,正确的是_。(分数:2.00)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数C.只能通过指针或引用调用虚函数D.抽象类中的成员函数都是虚函数9.有如下程序: #includeiostream using namespace std; class Base public: void fun1()cout“Baseha/n“; virtual void fun2()cout“Base/n“; ; class Derived:public Base public: void fun1()cout“Derived/n“; void fun2()cout“Derived/n“; ; v
8、oid f(Baseb.fun2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是_。(分数:2.00)A.BaseBaseB.BaseDerivedC.DerivedBaseD.DerivedDerived10.有如下程序 #includeiostream using namespace std; class A public: virtual void func1()cout“A1“; void func2()cout“A2“; ; class B:public A public: void func1()cout“B1“;
9、 void func2()cout“B2“; ; int main() A *p=new B; p-func1(); P-func2(); return 0; 运行此程序,屏幕上将显示输出_。(分数:2.00)A.B1B2B.A1A2C.B1A2D.A1B211.如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #includeiostream using namespace std; class Base iht a,b; public: Base(int x,int y)a=x;b=y; void show()cou
10、ta“,“bendl; ; class Derived:public Base int c,d; public: Derived(int x,int y,int z,int m):Base(x,y)c=z;d=m; void show()coutc“,“dendl; ; int main() Base B1(50,50),*pb; Derived D1(10,20,30,40); pb= return 0; return(); 运行时输出的结果是_。(分数:2.00)A.10,20B.30,40C.20,30D.50,5012.虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这
11、样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数。而非虚函数不支持多态调用。有如下程序: #includeiostream using namespace std; class Base public: virtual void f()cout“f0+“; void g()cout“g0+“; ; class Derived:public Base public: void f()cout“f+“;) void gocout,“g+“; ; int main Derived d: Base *p= p-f();P-g(); return 0; 运行时输出的结果是_。(分数:2.00)
12、A.f+g+B.f0+g+C.f+g0+D.f0+g0+13.有如下程序; #includeiostream using namespace std; class Base public: void output()cout1; virtual void Print()cout“B“; ; class Derived:public Base public: void output()cout2; void Print()cout“D“;) ; int main() Base *ptr=new Derived; ptr-output(); ptr-Print(); delete ptr; ret
13、urn 0; 程序的输出结果是_。(分数:2.00)A.1BB.1DC.2BD.2D14.有如下程序: #includeiostream using namespace std; class B public: virtual void show()cout“B“; ; class D:public B public: void show()cout“D“; ; void fun1(B *ptr)ptr-show(); void fun2(B void fun3(B b)b.show(); int main() B b.*p=new D; D d; fun1(p); fun2(b); fun3
14、(d); return 0; 程序的输出结果是_。(分数:2.00)A.BBBB.BBDC.DBBD.DBD15.下列有关抽象类和纯虚函数的叙述中,错误的是_。(分数:2.00)A.拥有纯虚函数的类是抽象类,不能用来定义对象B.抽象类的派生类若不实现纯虚函数,它也是抽象类C.纯虚函数的声明以“=0;”结束D.纯虚函数都不能有函数体16.有如下程序: #includeiostream using namespace std; class GA public; virtual int f()return 1; ; class GB:public GA public; virtual int f()
15、return 2; ; void show(GA g)coutg.f(); void display(GA ) int main() GA a:show(a);display(a); GB b:show(b);display(b); return 0; 运行时的输出结果是_。(分数:2.00)A.1111B.1211C.1112D.121217.下列选项中,与实现运行时多态性无关的是_。(分数:2.00)A.重载函数B.虚函数C.指针D.引用18.在一个抽象类中,一定包含有_。(分数:2.00)A.虚函数B.纯虚函数C.模板函数D.重载函数19.有如下程序: #includeiostream
16、using namespace std; class A public: virtual void f()cout1; void g()cout2; ; class B:public A public: virtual void f()cout3; void g()cout4; ; void show(A a.g();) int main() B b; show(b); return 0; 运行时的输出结果是_。(分数:2.00)A.12B.34C.14D.3220.有如下程序: #includeiostream using namespace std; class Publication /
17、出版物类 char name30; public: Publication(char *name=“未知名称“) strcpy(this-name,name); const cha * getName()constreturn name; virtual const char * getType()constreturn“未知类型“; ; class Book:public Publication /书类 public: Book(char *name): Publication(name) virtual const char * getType()constreturn“书“; ; voi
18、d showPublication(Publication int main() Book book(“精彩人生“); showPublication(book); return 0; 运行时的输出结果是_。(分数:2.00)A.未知类型:未知名称B.未知类型:精彩人生C.书:未知名称D.书:精彩人生21.下面是类 shape 的定义: class Shape public: Virtual void Draw()=0; ; 下列关于 Shape 类的描述中,正确的是_。(分数:2.00)A.类 Shape 是虚基类B.类 Shape 是抽象类C.类 Shape 中的 Draw 函数声明有误D
19、.语句“Shape s;”能够建立 Shape 的一个对象 s22.有如下程序: #includeiostream using namespace std; class B public: B(int xx):x(xx)+count;x+=10; virtual void show()const coutcount“_“xendl; protected: static int count; private: int x; ; class D:public B public: D(int xx,int yy):B(xx),y(yy)+count;y+=100; virtual void show
20、()const coutcount“_“yendl; private: int y; ; int B:count=0; int main() B *ptr=new D(10,20); ptr-show(); delete ptr; return 0; 运行时的输出结果是_。(分数:2.00)A.1_120B.2_120C.1_20D.2_2023.有如下程序: #includeiostream usmg namespace std; class Instrument public: virtual void Display()=0; ; class Piano:public Instrumen
21、t public: void Display()/*函数体程序略*/) ; int main() Instrument s; Instrument *p=0; /.; return 0; 下列叙述中正确的是_。(分数:2.00)A.语句“Insturment *p=0;”编译时出错B.语句“Instrument s;”编译时出错C.类 Piano 中的 Display 函数不是虚函数D.类 Instrument 是一个虚基类24.有如下程序: #includeiostream using namespace std; class Book public: Book(char *t=“)strc
22、py(title,t); _ private: char title40; ; class Novel:public Book public: Novel(char*t=“):Book(t) char*Category()constreturn“文学“; ; int main() Book *pb; pb=new Novel(); coutpb-Category(); return 0; 若程序运行时输出结果是“文学”,则划线处缺失的语句是_。(分数:2.00)A.char* Category();B.char* Category() const;C.virtual char* Categor
23、y()const;D.virtual char* Category() const=0;25.有如下程序: #includeiostream using namespace std; class Base public: virtual void function1() cout“0“; void function2() cout“1“; ; class Derived:public Base public: void function1() cout“2“; void function2() cout“3“; ; int main() Base* p=new Derived(); p-fun
24、ction1(); p-function2(); return 0; ; 运行时的输出结果是_。(分数:2.00)A.01B.21C.03D.2326.有如下程序: #includeiostream using namespace std; class Base public: virtual void Show()cout“B“; ; class Derived:public Base public: void Show()cout“D“; ; int main() Base *p1=new Derived; Derived *p2=new Derived; p1-Show(); p2-Sh
25、ow(); delete p1; delete p2; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.BBB.BDC.DBD.DD27.有如下类定义 class Animal public: virtual void Name()=0; ; class Koala:public Animal public: void Name()/*函数体略*/ ; 关于上述类定义,下列描述中错误的是_。(分数:2.00)A.类 Koala 是类 Animal 的派生类B.类 Koala 中的 Name 函数是一个虚函数C.类 Animal 中的 Name 函数是一个纯虚函数D.语句“
26、Animal a;”能够建立类 Animal 的一个对象 a28.有如下程序: #includeiostream using namespace std; class B public: virtual void f()cout“B“; void g()cout“B“; ; class D:public B public: void f()cout“D“; void g()cout“D“;) ; void h(B* p)p-f();p-g(); int main() D obj; h( return 0; 运行这个程序的输出结果是_。(分数:2.00)A.DDB.BBC.BDD.DB29.运算
27、符重载是对已有的运算符赋予多重含义,因此_。(分数:2.00)A.可以对基本类型(如 int 类型)的数据,重新定义“+”运算符的含义B.可以改变一个已有运算符的优先级和操作数个数C.只能重载 C+中已经有的运算符,不能定义新运算符D.C+中已经有的所有运算符都可以重载30.关于运算符重载,下列表述中正确的是_。(分数:2.00)A.C+已有的任何运算符都可以重载B.运算符函数的返回类型不能声明为基本数据类型C.在类型转换符函数的定义中不需要声明返回类型D.可以通过运算符重载来创建 C+中原来没有的运算符31.通过运算符重载,可以改变运算符原有的_。(分数:2.00)A.操作数类型B.操作数个
28、数C.优先级D.结合性32.下列运算符中,不能被重载的是_。(分数:2.00)A.,下列关于这个函数的叙述中,错误的是_。(分数:3.00)A.这是运算符-的重载运算符函数B.这个函数所重载的运算符是一个一元运算符C.这是一个成员函数D.这个函数不改变类的任何数据成员的值43.在表达式 x+y*z 中,+是作为成员函数重载的运算符,*是作为非成员函数重载的运算符。下列叙述中正确的是_。(分数:3.00)A.operator+有两个参数,operator*有两个参数B.operator+有两个参数,operator*有一个参数C.operator+有一个参数,operator*有两个参数D.op
29、erator+有一个参数,operator*有一个参数44.有如下程序: #includeiostream using namespace std; class Complex double re,im; public: Complex(double r,double i):re(r),im(i) double real()constretutn re; double image()constreturn im; Complex im+=a.im; return *this; ; ostream int main() Complex x(1,-2),y(2,3); cout(x+=y)endl
30、; return 0; 执行这个程序的输出结果是_。(分数:3.00)A.(1,-2)B.(2,3)C.(3,5)D.(3,1)45.有如下的运算符重载函数定义: double operator+(int i,int k)return double(i+k); 但定义有错误,对这个错误最准确的描述是_。(分数:3.00)A.+只能作为成员函数重载,而这里的+是作为非成员函数重载的B.两个 int 型参数的和也应该是 int 型,而这里将+的返回类型声明为 doubleC.没有将运算符重载函数声明为某个类的友元D.C+已经提供了求两个 int 型数据之和的运算符+,不能再定义同样的运算符46.下
31、面程序中对一维坐标点类 Point 进行运算符重载 #includeiostream using namespace std; class Point public: Point(int val)x=val; Pointreturn *this; Point operator+(int)Point old=*this;+(*this);return old; Int GetX()constreturn x; private: int x; ; int main() Point a(10); cout(+a).GetX(); couta+.GetX(); return 0; 编译和运行情况是_。
32、(分数:3.00)A.运行时输出 1011B.运行时输出 1111C.运行时输出 1112D.编译有错二级 C+-112 答案解析(总分:100.00,做题时间:90 分钟)一、选择题(总题数:46,分数:100.00)1.有如下程序: #includeiostream using namespace std; class Basel public: Basel(int d) coutd; Base1() ; class Base2 public: Base2(int d) coutd; Base2() ; class Derived:public Base1,Base2 public: De
33、rived(int a,int b,int c,int d); Base1(b),Base2(a),b1(d),b2(c) Private: int b1; int b2; ; int main() Derived d(1,2,3,4); return 0; 运行时的输出结果是_。(分数:2.00)A.1234B.2134C.12D.21 解析:解析 程序在创建派生类对象 d 时,分别调用基类 Base1 和 Base1 的构造函数。2.己知基类 Employee 只有一个构造函数,其定义如下: Employee:Employee(int n):id(n) Manager 是 Employee
34、 的派生类,则下列对 Manager 的构造函数的定义中,正确的是_。(分数:2.00)A.Manager:Manager(int n):id(n)B.Manager:Manager(int n)id=n;C.Manager:Manager(int n):Employee(n) D.Manager:Manager(int n)Employee(n);解析:解析 基类的构造函数是带有参数的,派生类从基类派生,这就需要在派生类的构造函数名后面显示的调用基类的构造函数。3.有如下程序: #includeiostream using namespace std; class A public: A()
35、cout“A“; A()cout“C“; ; class B:public A public: B()cout“G“; B()cout“T“; ; int main() B obj; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.GATCB.AGTC C.GACTD.AGCT解析:解析 派生类 B 是由基类 A 公开继承而来,所以在创建类 B 的 obj 对象时,首先执行基类 A 的构造函数 A(),输出 A,再执行派生类 B 的构造函数 B(),输出 G,当程序结束时,首先执行派生类的析构函数B(),输出 T,再执行基类 A 的析构函数A(),输出 C。4.有如下程序
36、: #includeiostream using namespace std; class Base public: void fun()cout“B“;) ; class Derived:public Base public: void tun()_cout“D“; ; int main() Derived d; d.fun(); return 0; 若程序的输出结果是 BD,则划线处缺失的部分是_。(分数:2.00)A.fun();B.Base.fun();C.Base:fun(); D.Base-fun();解析:解析 派生类 Derived 的对象 d 调用其成员函数 fun(),要输
37、出结果为 BD,所以在其成员函数fun()中要调用基类 Base 的成员函数 fun()。5.下列关于虚基类的描述中,错误的是_。(分数:2.00)A.使用虚基类可以消除由多继承产生的二义性B.构造派生类对象时,虚基类的构造函数只被调用一次C.声明“class B:virtual public A”说明类 B 为虚基类 D.建立派生类对象时,首先调用虚基类的构造函数解析:解析 虚基类是为了消除由多重继承产生的二义性而提出的。虚基类的说明格式是: Class类名:virtual继承方式基类名,其中关键字 virtual 与继承方式的位置无关,但必须位于基类名之前,且 virtual 只对紧随其后
38、基类名起作用。对于本题来说,声明“class B:virtual public A”说明类 A 为虚基类。6.有如下程序: #includeiostream using namespace std; class Mountain int height; public: Mountain(int h=0):height(h) virtual char* GetName()constreturn“山“; int GetHeight() constreturn height; ; class Lushan:public Mountain Public: Lushan(int d):Mountain(
39、d) Char* GetName()constreturn“庐山“; ; int main() Mountain *p=new Lushan(1000); coutp-GetName()“海拔“p-GetHeight()“米“; return 0; 运行这个程序的输出结果是_。(分数:2.00)A.庐山海拔 1000 米 B.庐山海拔 0 米C.山海拔 1000 米D.山海拔 0 米解析:解析 在基类 Mountain 中定义了虚函数 GetName()输出字符串“山”,而在派生类 Lushan 中对虚函数 GetName()进行了重新定义,输出字符串“庐山”。在主函数中对派生类中的虚函数 G
40、etName()进行了多态调用,此时调用的是派生类中重新定义的 GetName(),输出字符字符串“庐山”。7.在 C+中,用于实现运行时多态性的是_。(分数:2.00)A.内联函数B.重载函数C.模板函数D.虚函数 解析:解析 此题考查的是虚函数的概念。C+语言的多态性有两种:函数重载和虚函数。虚函数只有在运行时才能被确定,称为运行时多态。编译时的多态是通过函数重载和模板实现的。8.下列关于虚函数的说明中,正确的是_。(分数:2.00)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数 C.只能通过指针或引用调用虚函数D.抽象类中的成员函数都是虚函数解析:解析 此题考查的是虚函数的
41、概念。在成员函数的声明前面加上 virual 关键字,即可把函数声明为虚函数。虚函数可以是另一个函数的友元函数而不能是静态成员函数。9.有如下程序: #includeiostream using namespace std; class Base public: void fun1()cout“Baseha/n“; virtual void fun2()cout“Base/n“; ; class Derived:public Base public: void fun1()cout“Derived/n“; void fun2()cout“Derived/n“; ; void f(Baseb.f
42、un2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是_。(分数:2.00)A.BaseBaseB.BaseDerived C.DerivedBaseD.DerivedDerived解析:解析 此题考查的是虚函数的概念。在 C+语言中,一个派生类的对象可以被它的任何一个基类的指针所指向,若基类和派生类中存在一模一样的成员函数。那么通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的;否则就调用基类中的。本题中,在 f()函数中,形参 b 是一个基类的引用,它引用的是主函数中定义的派生类对象 o
43、bj,所以在调用 fun1()时,运行的是基类的版本,而 fun2()运行的是派生类的版本。10.有如下程序 #includeiostream using namespace std; class A public: virtual void func1()cout“A1“; void func2()cout“A2“; ; class B:public A public: void func1()cout“B1“; void func2()cout“B2“; ; int main() A *p=new B; p-func1(); P-func2(); return 0; 运行此程序,屏幕上将显
44、示输出_。(分数:2.00)A.B1B2B.A1A2C.B1A2 D.A1B2解析:解析 此题考查的是虚函数的概念。此题中,func1 是虚函数,func2 是一般成员函数,而且在派生类与基类中都存在两个这样的函数。在主函数中,语句 A*p=new B;定义了一个基类的指针 p,并让它指向一个派生类对象。所以通过该指针调用 func1 时,运行的是派生类的版本,而通过该指针调用 func2运行的是基类的版本。所以程序运行的最后输出是:B1A2。11.如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #includeios
45、tream using namespace std; class Base iht a,b; public: Base(int x,int y)a=x;b=y; void show()couta“,“bendl; ; class Derived:public Base int c,d; public: Derived(int x,int y,int z,int m):Base(x,y)c=z;d=m; void show()coutc“,“dendl; ; int main() Base B1(50,50),*pb; Derived D1(10,20,30,40); pb= return 0;
46、 return(); 运行时输出的结果是_。(分数:2.00)A.10,20 B.30,40C.20,30D.50,50解析:解析 此题考查的是多态性。在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。在实函数的情况下。通过基类指针所调用的只能是基类的那个函数版本,无法调用到派生类中重定义函数。此题中,通过指针pb 所调用的是基类的版本,即输出 a 和 b 的值 10,20。12.虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数。而非虚函数不支持多态调用。有如下程序: #includeiostream using namespace std; class Base public: virtual void f()cout“f0+“; void g()cout“g0+“;