1、国家二级 C+机试(继承和派生)模拟试卷 14及答案解析(总分:54.00,做题时间:90 分钟)一、选择题(总题数:27,分数:54.00)1.已知基类 Employee只有一个构造函数,其定义如下: Employee:Employee(int n):id(n) Manager是 Employee的派生类,则下列对 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:M
2、anager(int n)Employee(n);2.有如下程序: #includeiostream using namespace sta; class A public: A()coutA; A()coutC; ; class B:public A public: B()coutG; B()coutT; ; int main() B obj; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.GATCB.AGTCC.GACTD.AGCT3.有如下程序: #includeiostream using namespace std; class Base public:
3、void fun0toutB; ; class Derived:public Base public: void fun()_coutD; ;int main() Derived d; dfun(); return 0; 若程序的输出结果是 BD,则划线处缺失的部分是( )。(分数:2.00)A.fun();B.Basefun();C.Base:fun();D.Base-fun();4.下列关于虚基类的描述中,错误的是( )。(分数:2.00)A.使用虚基类可以消除由多继承产生的二义性B.构造派生类对象时,虚基类的构造函数只被调用一次C.声明“class B:virtual public A”
4、说明类 B为虚基类D.建立派生类对象时,首先调用虚基类的构造函数5.有如下程序: #inchutbiostream using namespace std; class Mountain int height; public: Mountain(int h=-):height(h) virtual ehar*GetName() constreturn山; int GetHeight() constreturn height; ; class Lushan:public Mountain Public: Lushan(int d):Mountain(d) Char*GetName() const
5、return庐山; ; int main() Mountain*p=new Lushan(1000); coutp-GetName()海拔p-GetHeight()米; return 0; 运行这个程序的输出结果是( )。(分数: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.有如下程序: #includeiostream using namespace std; class Base public: void fun1()coutBasen; virtual void fun2()coutBasen; ; class Derived:public Base public: void fun1()coutDerivedn; void fun2()coutDerivedn; ;void f(Base int main Derived d; Base*p= 下列关于 Shape类的描述中,正确的是( )。(分数:2.00)A.类 Shape是虚基类
7、B.类 Shape是抽象类C.类 ShaDe中的 Draw函数声明有误D.语句Shape s;能够建立 Shape的一个对象 s21.有如下程序: using namespace std; class B public: B(int xx):x(xx)+count;x+=10; virtual void show()const coutcount_xendl; protected: static hat count; private: mt x: ; class D:public B public: D(int xx,int yy):B(xx),y(yy)+count;y+=100; virt
8、ual void Show()const coutcount_yend1; 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_2022.有如下程序: #includeiostream using namespace std; class Instrument public: virtual void Display():0; ; class Piano:pub
9、lic Instrument 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是一个虚基类23.有如下程序: #includeiostream using namespace std; class Book public: Book(char*t= )
10、strcpy(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*Category()co
11、nst;D.virtual char*Category()const=0;24.有如下程序: #includeiostream using namespace std; class Base public: virtual void function1() tout0; void function2()cout1; ; class Derived:public Base public: void function1()tout2; void function2()cout3; ; int main() Base*p=new Derived(); p-function1(); p-functio
12、n2(); return 0; ; 运行时的输出结果是( )。(分数:2.00)A.01B.21C.03D.2325.有如下程序: #includeiostream using namespace std; class Base public: virtual void Show()coutB; ; class Derived:public Base public: void Show()coutD; ;int main() Base*p1=new Derived; Derived*p2=newDerived; p1-Show(); p2-Show(); delete p1; delete p
13、2; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.BBB.BDC.DBD.DD26.有如下类定义 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.语句“Animal a;”能够建立类 Animal的一个对象
14、a27.有如下程序: #includeiostream using namespace std; class B public: virtual void f()coutB; void g()coutB; ; class D:public B public: void f()coutD; void g()coutD; ; void h(B*p) p-f();p-g(); int main() D obj; h( int main Derived d; Base*p= 下列关于 Shape类的描述中,正确的是( )。(分数:2.00)A.类 Shape是虚基类B.类 Shape是抽象类 C.类
15、ShaDe中的 Draw函数声明有误D.语句Shape s;能够建立 Shape的一个对象 s解析:解析:因为类 Shape中包含纯虚函数 Draw(),所以类 Shape是抽象类。21.有如下程序: using namespace std; class B public: B(int xx):x(xx)+count;x+=10; virtual void show()const coutcount_xendl; protected: static hat count; private: mt x: ; class D:public B public: D(int xx,int yy):B(x
16、x),y(yy)+count;y+=100; virtual void Show()const coutcount_yend1; 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_120 C.1_20D.2_20解析:解析:在主函数中定义了一个基类 B的指针变量 ptr,并调用类 D的构造函数创建了类 D的实例对象,因为变量 count是全局变量所以在调用基类 B的构造函数给其值加 1
17、,在调用 D的构造函数时给其值加 1,因而输出其值等于 2,在类 D的构造函数中给成员变量 y的值加 100,所以其等于 120并输出。22.有如下程序: #includeiostream using namespace std; class Instrument public: virtual void Display():0; ; class Piano:public Instrument Public: void Display()*函数体程序略*) ; int main() Instrument s; Instrument *p=0; ; return 0; 下列叙述中正确的是( )。
18、(分数:2.00)A.语句Insturment *p=0;“编译时出错B.语句Instrument s;编译时出错 C.类 Piano中的 Display函数不是虚函数D.类 Instrument是一个虚基类解析:解析:由于函数 Display()是一个纯虚函数,所以类 Instrument是抽象类,而抽象类是不能定义对象的,因而选项 B为正确选项。23.有如下程序: #includeiostream using namespace std; class Book public: Book(char*t= )strcpy(title,t); private: char title40; cla
19、ss 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*Category()const;D.virtual char*Category()const=0; 解析:解析
20、:根据程序运行的结果为:文学,说明程序执行了派生类 Novel中的成员函数*Category()constreturn文学;,所以在基类 Book中要把函数*Category()const 定义为纯虚函数。24.有如下程序: #includeiostream using namespace std; class Base public: virtual void function1() tout0; void function2()cout1; ; class Derived:public Base public: void function1()tout2; void function2()
21、cout3; ; int main() Base*p=new Derived(); p-function1(); p-function2(); return 0; ; 运行时的输出结果是( )。(分数:2.00)A.01B.21 C.03D.23解析:解析:函数 function1()在基类 Base中定义为虚成员函数,而在派生类 Dervied中重新进行了定义,输出字符 2,函数 function2()在基类 Base中定义虚成员函数,在主函数中使用指向基类的指针变量p访问 function2()时,输出 1。25.有如下程序: #includeiostream using namespac
22、e std; class Base public: virtual void Show()coutB; ; class Derived:public Base public: void Show()coutD; ;int main() Base*p1=new Derived; Derived*p2=newDerived; p1-Show(); p2-Show(); delete p1; delete p2; return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.BBB.BDC.DBD.DD 解析:解析:在基类 Base中定义了虚函数 Show()输出字符B,而在派生类 De
23、rived中对虚函数 Show()进行了重新定义,输出字符D。在主函数中对基类和派生类中的虚函数 Show()进行了多态调用,此时调用的是派生类中重新定义的 Show(),输出字符D。26.有如下类定义 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函数是一
24、个纯虚函数D.语句“Animal a;”能够建立类 Animal的一个对象 a 解析:解析:在类 Animal定义了纯虚函数 Name(),所以类 Animal就是一个抽象类,而抽象类是不能够建立对象的。27.有如下程序: #includeiostream using namespace std; class B public: virtual void f()coutB; void g()coutB; ; class D:public B public: void f()coutD; void g()coutD; ; void h(B*p) p-f();p-g(); int main() D obj; h(&obj); return 0; 运行这个程序的输出结果是( )。(分数:2.00)A.DDB.BBC.BDD.DB 解析:解析:在基类 B中定义虚函数 f()和成员函数 g(),而在派生类 D中定义了函数 f()和同名函数 g()。而函数 h中的形参为指向基类的指针变量 p,所以在主函数中执行 h(&obj)时,会调用派生类的函数 f(),输出 D,再调用基类的函数 g(),输出 B。