1、国家二级 C+机试(继承和派生)模拟试卷 17及答案解析(总分:54.00,做题时间:90 分钟)一、选择题(总题数:27,分数:54.00)1.已知基类 Emp1oyee只有一个构造函数,其定义如下: Emp1oyee:Emp1oyee(int n):id(n) Manager是 Emp1oyee的派生类,则下列对 Manager的构造函数的定义中,正确的是( )。(分数:2.00)A.Manager:Manager(int n):id(n)B.Manager:Manager(int n)id=n;C.Manager:Manager(int n): Emp1oyee(n)D.Manager:
2、Manager(int n)Emp1oyee(n);2.有如下程序: #incLude iostream using namespace std; c1ass A public: A()cout“A; A()coutC; ; c1ass B:public A public: BOcoutG; BOcouKT; ; int main0 B obj; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.GATCB.AGTCC.GACTD.AGCT3.有如下程序: #inc1udeiostream using namespace std; c1ass Base public:
3、void fun0 coutB; ; c1ass Derived:public Base public: void fun()_coutD; ; int main() Derived d; dfun(); rel:um 0; 若程序的输出结果是 BD,则划线处缺失的部分是( )。(分数:2.00)A.fun();B.Basefun();C.Base:fun();D.Basefun();4.下列关于虚基类的描述中,错误的是( )。(分数:2.00)A.使用虚基类可以消除由多继承产生的二义性B.构造派生类对象时,虚基类的构造函数只被调用一次C.声明“c1ass B:virtual public A
4、”说明类 B为虚基类D.建立派生类对象时,首先调用虚基类的构造函数5.有如下程序: #inc1udeiostream using namespace std; c1ass Mountain int height; public: Mountain (int h=0):height(h) virtual char* GetName()constretum“山; int GetHeight()constreturn height;) ; c1ass Lushan:public Mountain Public: Lushan(int d):Mountain(d) Char*GetName()cons
5、treturn“庐山; ; int main() Mountain *p=new Lushan(1000); coutpGetName()“海拔“pGetHeight()“米“; return0; 运行这个程序的输出结果是( )。(分数:2.00)A.庐山海拔 1000米B.庐山海拔 0米C.山海拔 1000米D.山海拔 0米6.在 C+中,用于实现运行时多态性的是( )。(分数:2.00)A.内联函数B.重载函数C.模板函数D.虚函数7.下列关于虚函数的说明中,正确的是( )。(分数:2.00)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数C.只能通过指针或引用调用虚函数D.抽
6、象类中的成员函数都是虚函数8.有如下程序: #inc1ude iostream using namespace std; c1ass Base public: void funl()cout“Base/n“; virtual void fun2()cout“Base/n“; ; c1ass Derived: public Base public: void fun1()cout“Derived/n“; void fun2()cout“Derived/n“; ; void f(Base bfun2(); int main() Derived obj; f(obj); return 0; 执行这个
7、程序的输出结果是( )。(分数:2.00)A.Base BaseB.Base DerivedC.Derived BaseD.Derived Derived9.有如下程序 #inc1ude iostream using namespace std; c1assA public: virtual void func1()cout“A1“; void func2()cout“A2“; ; c1ass B:public A public: void func1() cout“B1“; void func2()cout“B2“; ; int main() A*p=newB; pfunc1(); pfun
8、c2(); return 0; 运行此程序,屏幕上将显示输出( )。(分数:2.00)A.B1B2B.A1A2C.B1A2D.A1B210.如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #inc1ude iostream using namespace std; c1ass Base int a,b, public: Base (int x,int y)a=x; b=y; void show()couta,bend1; ;c1ass Derived:public Base int c,d; public: Deriv
9、ed (int x,int y,int z,int m):Base(x,y)c=z; d=m;) void show()coutc,dend1;) ; int main() Base B1(50,50),*pb; Derived D1(10,20,30,40); pb= retum0: retum(); 运行时输出的结果是( )。(分数:2.00)A.10,20B.30,40C.20,30D.50,5011.虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数。而非虚函数不支持多态调用。 有如下程序: #inc1ude i
10、ostream using namespace std; c1ass Base public: virtual void f()cout“f0+“; void g()cout“g0+“; ; c1ass Derived:public Base public: Void g()cont“f+“; void gocout,“g+“; ; int main Derived d; Base*p= c1ass Base public: void output0 cout1; virtual void Print0 coutB; ; c1ass Derived:public Base public: vo
11、id output()cout2; void Print()coutD; ; int main() Base *ptr=new Derived; ptroutput(); ptrPrint(); delete ptr; retum 0; 程序的输出结果是( )。(分数:2.00)A.1BB.1DC.2BD.2D13.有如下程序; #inc1udeiostream using namespace std; c1ass B public: virtualvoidshow()cout“B“; ; c1ass D:public B public: void show()count“D“; ; void
12、 funl(B *ptr)ptrshow();) void fun2(B void fun3(B b)bshow(); int main() B b,*p=new D; D d; fun1(p); fun2(b); fun3(d); retum 0; 程序的输出结果是( )。(分数:2.00)A.BBBB.BBDC.DBBD.DBD14.下列有关抽象类和纯虚函数的叙述中,错误的是( )。(分数:2.00)A.拥有纯虚函数的类是抽象类,不能用来定义对象B.抽象类的派生类若不实现纯虚函数,它也是抽象类C.纯虚函数的声明以“=0;”结束D.纯虚函数都不能有函数体15.有如下程序: #inc1udei
13、ostream using namespace std; c1ass GA public; virtual int f()retuml; ; c1ass GB: public GA public; virtual int f()return 2; ; void show(GAg)coutgf(); void disp1ay(GA int main() GA a:show(a); disp1ay(a); GB b:show(b); disp1ay(b); retum 0; 运行时的输出结果是( )。(分数:2.00)A.1111B.1211C.1112D.121216.下列选项中,与实现运行时多
14、态性无关的是( )。(分数:2.00)A.重载函数B.虚函数C.指针D.引用17.在一个抽象类中,一定包含有( )。(分数:2.00)A.虚函数B.纯虚函数C.模板函数D.重载函数18.有如下程序: #inc1udeiostream using namespace std; c1ass A public: virtual void f()cout1; void g0cout2; ; c1ass B:public A public: Virtual void f()cout3; void g()cout4; ; void show(A ag(); int main() B b; show(b);
15、 return 0; 运行时的输出结果是( )。(分数:2.00)A.12B.34C.14D.3219.有如下程序: #inc1ude iostream using namespace std; c1ass Publication 出版物类 char name30; public: Publication(char *name=“未知名称“) strcpy(thisname,name); const char*getName()const return name; virtual const char*getType()const return“未知类型“; ; c1ass Book: pub
16、lic Publication 书类 public: Book(char *name):Publication(name) virtual const char*getType()const return“书“; ; void showPublication( Publication int main() Book book(“精彩人生“);showPublication(book); return 0; 运行时的输出结果是( )。(分数:2.00)A.未知类型:未知名称B.未知类型:精彩人生C.书:未知名称D.书:精彩人生20.下面是类 shape的定义: c1ass Shape publi
17、c: Virtual void Draw()=0; ; 下列关于 Shape类的描述中,正确的是( )。(分数:2.00)A.类 Shape是虚基类B.类 Shape是抽象类C.类 Shape中的 Draw函数声明有误D.语句“Shape s;”能够建立 Shape的一个对象 s21.有如下程序: #inc1ude iostream using namespace std; c1ass B public: B(int xx):x(xx)+count;x+=10; virtual void show()const coutcount_xend1; protected: static int co
18、unt; private: intx; ; c1ass D:public B public: D(int xx,int yy):B(xx),y(yy)+count;y+=100; virtual void show()const coutcountyend1;) private: int y; ; int B:count =0; int main() B *ptr=new D(10,20); ptrshow0; delete ptr; retum 0; 运行时的输出结果是( )。(分数:2.00)A.1_120B.2_120C.1_20D.2_2022.有如下程序: #inc1ude iost
19、ream using namespace std; c1ass Instrument public: virtual void Disp1ay()=0; ; c1ass Piano: public Instrument public: void Disp1ay()*函数体程序略*) ; int main() Instrument s; Instrument *p=0; /*; return0; 下列叙述中正确的是( )。(分数:2.00)A.语句“Insturment *p=0;”编译时出错B.语句“Instrument s;”编译时出错C.类 Piano中的 Disp1ay函数不是虚函数D.
20、类 Instrument是一个虚基类23.有如下程序: #inc1ude iostream using namespace std; c1ass Book public: Book(char*t=“) strcpy(title,t); _ private: char title40; ; c1ass Novel: public Book public: Novel(char*t=“):Book(t) char*Category()const refflm“文学“; ; int main() Book *pb; pb=new Novel(); coutpbCategory(); return0;
21、 若程序运行时输出结果是“文学”,则划线处缺失的语句是( )。(分数:2.00)A.char*Category0;B.char* Category()const;C.virtual char* Category()const;D.virtualchar* Category()const();24.有如下程序: #inc1ude iostream using namespace std; c1ass Base public: virtual void functionl() cout0; void function2()cout1; ; c1ass Derived: public Base pu
22、blic: void functionl()cout2; void function2() cout3; ; int main() Base*p= new Derived(); pfunctionl(); pfunction2(); return (); ; 运行时的输出结果是( )。(分数:2.00)A.01B.21C.03D.2325.有如下程序: #inc1udeiostream using namespace std; c1ass Base public: virtual void Show()coutB; ; c1ass Derived: public Base public: vo
23、id Show() cout;D; ; int main() Base *p1=new Derived; Derived *p2=new Derived; p1S1:tow(); p2Show(); delete p1; delete p2; retum0; 运行这个程序的输出结果是( )。(分数:2.00)A.BBB.BDC.DBD.DD26.有如下类定义 c1ass Animal public: virtual void Name()=0; ; c1ass Koala:public Animal public: void Name()/*函数体略*/ ; 关于上述类定义,下列描述中错误的是
24、( )。(分数:2.00)A.类 Koala是类 Animal的派生类B.类 Koala中的 Name函数是一个虚函数C.类 Animal中的 Name函数是一个纯虚函数D.语句“Animal a;”能够建立类 Animal的一个对象 a27.有如下程序: #inc1udeiostream using namespace std; c1ass B public: virtual void f()cout“B“; void g()cout“B“; ; c1ass D:public B public: void f()cout“D“; void g()cout“D“; ; void h(B*p)p
25、f();pg(); int main() D obj; h(C.Manager:Manager(int n): Emp1oyee(n) D.Manager:Manager(int n)Emp1oyee(n);解析:解析:基类的构造函数是带有参数的,派生类从基类派生,这就需要在派生类的构造函数名后面显示的调用基类的构造函数。2.有如下程序: #incLude iostream using namespace std; c1ass A public: A()cout“A; A()coutC; ; c1ass B:public A public: BOcoutG; BOcouKT; ; int ma
26、in0 B obj; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.GATCB.AGTC C.GACTD.AGCT解析:解析:派生类 B是由基类 A公开继承而来,所以在创建类 B的 obj对象时,首先执行基类 A的构造函数 A(),输出 A,再执行派生类 B的构造函数 BO,输出 G,当程序结束时,首先执行派生类的析构函数BO,输出 T,再执行基类 A的析构函数A(),输出 C。3.有如下程序: #inc1udeiostream using namespace std; c1ass Base public: void fun0 coutB; ; c1ass Deri
27、ved:public Base public: void fun()_coutD; ; int main() Derived d; dfun(); rel:um 0; 若程序的输出结果是 BD,则划线处缺失的部分是( )。(分数:2.00)A.fun();B.Basefun();C.Base:fun(); D.Basefun();解析:解析:派生类 Derived的对象 d调用其成员函数 fun(),要输出结果为 BD,所以在其成员函数fun0中要调用基类 Base的成员函数 fun0。4.下列关于虚基类的描述中,错误的是( )。(分数:2.00)A.使用虚基类可以消除由多继承产生的二义性B.
28、构造派生类对象时,虚基类的构造函数只被调用一次C.声明“c1ass B:virtual public A”说明类 B为虚基类 D.建立派生类对象时,首先调用虚基类的构造函数解析:解析:虚基类是为了消除由多重继承产生的二义性丽提出的。虚基类的说明格式是:Class类名:virtual继承方式基类名,其中关键字 virtual与继承方式的位置无关,但必须位于基类名之前,且 virtual只对紧随其后基类名起作用。对于本题来说,声明“classB:virtual public A”说明类 A为虚基类。5.有如下程序: #inc1udeiostream using namespace std; c1a
29、ss Mountain int height; public: Mountain (int h=0):height(h) virtual char* GetName()constretum“山; int GetHeight()constreturn height;) ; c1ass Lushan:public Mountain Public: Lushan(int d):Mountain(d) Char*GetName()constreturn“庐山; ; int main() Mountain *p=new Lushan(1000); coutpGetName()“海拔“pGetHeight
30、()“米“; return0; 运行这个程序的输出结果是( )。(分数:2.00)A.庐山海拔 1000米 B.庐山海拔 0米C.山海拔 1000米D.山海拔 0米解析:解析:在基类 Mountain中定义了虚函数 GetName0输出字符串“山”,而在派生类 Lushan中对虚函数 GetName()进行了重新定义,输出字符串“庐山”。在主函数中对派生类中的虚函数 GetName0进行了多态调用,此时调用的是派生类中重新定义的 GetName0,输出字符字符串“庐山”。6.在 C+中,用于实现运行时多态性的是( )。(分数:2.00)A.内联函数B.重载函数C.模板函数D.虚函数 解析:解析
31、:此题考查的是虚函数的概念。C+语言的多态性有两种:函数重载和虚函数。虚函数只有在运行时才能被确定,称为运行时多态。编译时的多态是通过函数重载和模板实现的。7.下列关于虚函数的说明中,正确的是( )。(分数:2.00)A.从虚基类继承的函数都是虚函数B.虚函数不得是静态成员函数 C.只能通过指针或引用调用虚函数D.抽象类中的成员函数都是虚函数解析:解析:此题考查的是虚函数的概念。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数。虚函数可以是另一个函数的友元函数而不能是静态成员函数。8.有如下程序: #inc1ude iostream using namespace std;
32、 c1ass Base public: void funl()cout“Base/n“; virtual void fun2()cout“Base/n“; ; c1ass Derived: public Base public: void fun1()cout“Derived/n“; void fun2()cout“Derived/n“; ; void f(Base bfun2(); int main() Derived obj; f(obj); return 0; 执行这个程序的输出结果是( )。(分数:2.00)A.Base BaseB.Base Derived C.Derived Bas
33、eD.Derived Derived解析:解析:此题考查的是虚函数的概念。在 C+语言中,一个派生类的对象可以被它的任何一个基类的指针所指向,若基类和派生类中存在一模一样的成员函数。那么通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的;否则就调用基类中的。本题中,在 f0函数中,形参 b是一个基类的引用,它引用的是主函数中定义的派生类对象 obj,所以在调用 fun10时,运行的是基类的版本,而 fun20运行的是派生类的版本。9.有如下程序 #inc1ude iostream using namespace std; c1assA public: vir
34、tual void func1()cout“A1“; void func2()cout“A2“; ; c1ass B:public A public: void func1() cout“B1“; void func2()cout“B2“; ; int main() A*p=newB; pfunc1(); pfunc2(); return 0; 运行此程序,屏幕上将显示输出( )。(分数:2.00)A.B1B2B.A1A2C.B1A2 D.A1B2解析:解析:此题考查的是虚函数的概念。此题中,funcl 是虚函数,func2 是一般成员函数,而且在派生类与基类中都存在两个这样的函数。在主函数中
35、,语句 A*p=new B;定义了一个基类的指针 p,并让它指向一个派生类对象。所以通过该指针调用 funcl时,运行的是派生类的版本,而通过该指针调用 func2运行的是基类的版本。所以程序运行的最后输出是:BIA2。10.如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #inc1ude iostream using namespace std; c1ass Base int a,b, public: Base (int x,int y)a=x; b=y; void show()couta,bend1; ;c1ass
36、 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,dend1;) ; int main() Base B1(50,50),*pb; Derived D1(10,20,30,40); pb= retum0: retum(); 运行时输出的结果是( )。(分数:2.00)A.10,20 B.30,40C.20,30D.50,50解析:解析:此题考查的是多态性。在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用
37、虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。在实函数的情况下。通过基类指针所调用的只能是基类的那个函数敝本,无法调用到派生类中中重定义函数。此题中,通过指针 pb所调用的是基类的版本,即输出 a和 b的值 10,20。11.虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数。而非虚函数不支持多态调用。 有如下程序: #inc1ude iostream using namespace std; c1ass Base public: virtual void f()cout“f0+“; void g()co
38、ut“g0+“; ; c1ass Derived:public Base public: Void g()cont“f+“; void gocout,“g+“; ; int main Derived d; Base*p= c1ass Base public: void output0 cout1; virtual void Print0 coutB; ; c1ass Derived:public Base public: void output()cout2; void Print()coutD; ; int main() Base *ptr=new Derived; ptroutput();
39、 ptrPrint(); delete ptr; retum 0; 程序的输出结果是( )。(分数:2.00)A.1BB.1D C.2BD.2D解析:解析:此题考查的是虚函数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数;在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。本题中,从基类的定义可以看出:output()函数是普通成员函数,而 Print()函数是虚函数。所以,通过 ptr指针调用的 output()是基类中的 output(),而通过它调用的 Print()则是派
40、生类中的 Print()。13.有如下程序; #inc1udeiostream using namespace std; c1ass B public: virtualvoidshow()cout“B“; ; c1ass D:public B public: void show()count“D“; ; void funl(B *ptr)ptrshow();) void fun2(B void fun3(B b)bshow(); int main() B b,*p=new D; D d; fun1(p); fun2(b); fun3(d); retum 0; 程序的输出结果是( )。(分数:2
41、.00)A.BBBB.BBDC.DBB D.DBD解析:解析:此题考查的是虚函数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数:在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。此题中,fun10 和 fun2()的形参分别是基类的指针和引用,给 fun1()传入的实参是指向派生类对象的指针 p,fun1()将调用 D类中的 showO输出字符D;给 fun2()出入的实参是基类对象,fun2()调用类 B中的 show0输出字符B:fum3()由于形参是基类对象,调用的始终都
42、是基类的 show0,输出字符B。故最终输出结果是 DBB。14.下列有关抽象类和纯虚函数的叙述中,错误的是( )。(分数:2.00)A.拥有纯虚函数的类是抽象类,不能用来定义对象B.抽象类的派生类若不实现纯虚函数,它也是抽象类C.纯虚函数的声明以“=0;”结束D.纯虚函数都不能有函数体 解析:解析:此题考查的是抽象类和纯虚函数的概念。纯虚函数可以有函数体,它的实现由派生类给出。15.有如下程序: #inc1udeiostream using namespace std; c1ass GA public; virtual int f()retuml; ; c1ass GB: public GA
43、 public; virtual int f()return 2; ; void show(GAg)coutgf(); void disp1ay(GA int main() GA a:show(a); disp1ay(a); GB b:show(b); disp1ay(b); retum 0; 运行时的输出结果是( )。(分数:2.00)A.1111B.1211C.1112 D.1212解析:解析:此题考查派生类与虚函数的考查。由主函数 main入手,其中分别定义了类 GA和 GB的对象a和 b。首先,执行参数 a的 show函数调用,其中的输出语句为调用 GA类中的 f()虚函数,返回 1。
44、同理disp1ay(a)函数输出 1。show(b)函数中调用的为 GA中的 f()函数,disp1ay(b)调用 GA中 f()函数,返回1,disp1ay(b)调用 GB中的 f()函数返回 2。所以最后输出为 1112。16.下列选项中,与实现运行时多态性无关的是( )。(分数:2.00)A.重载函数 B.虚函数C.指针D.引用解析:解析:在 C+中,多态性可以分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模版体现的,运行时的多态性是通过虚函数体现的。17.在一个抽象类中,一定包含有( )。(分数:2.00)A.虚函数B.纯虚函数 C.模板函数D.重载函数解析:
45、解析:拥有纯虚函数的类叫做抽象类,所以抽象类中必然包含有虚函数。18.有如下程序: #inc1udeiostream using namespace std; c1ass A public: virtual void f()cout1; void g0cout2; ; c1ass B:public A public: Virtual void f()cout3; void g()cout4; ; void show(A ag(); int main() B b; show(b); return 0; 运行时的输出结果是( )。(分数:2.00)A.12B.34C.14D.32 解析:解析:在派
46、生类 classB中对基类中的虚拟成员函数 virtual voidf()和实函数 void g()进行了重新定义,在主函数中通过语句 show(b);调用派生类中的虚函数 virtual void f() cout3;输出 3,调用基类的实函数 void g() cout2;输出 2。所以选项 D为正确答案。19.有如下程序: #inc1ude iostream using namespace std; c1ass Publication 出版物类 char name30; public: Publication(char *name=“未知名称“) strcpy(thisname,name); const char*getName()const return name; virtual const char*getType()const return“未知类型“; ; c1ass Book: public Publication 书类 public: Book(char *name):Publication(name) virtual const char*getType()const return“书“; ; void showPublication( Publ