《面向对象程序设计》习题班级:学号:姓名:名单序号:成绩:第3章继承与派生一、选择题(共28分,每题1分)1.下列对派生类的描述中,()是错误的。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2.派生类的对象对它的哪一类基类成员是可以访问的?()A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3.关于多继承二义性的描述,()是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4.多继承派生类构造函数构造对象时,()被最先调用。
A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数D.派生类中子对象类的构造函数5.C++类体系中,能被派生类继承的是()。
A.构造函数B.虚函数C.析构函数D.友元函数6.设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员( )A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7.C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A.复用B.继承C.封装D.引用8.继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A.规律性B.传递性C.重复性D.多样性9.下列对基类和派生类关系的描述中,错误的是()。
A.派生类是基类的具体化B.派生类是基类的子集C.派生类是基类定义的延续D.派生类是基类的组合10.下列对派生类的描述中,错误的是()。
A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的缺省继承方式是privateD.派生类只含有基类的公有成员和保护成员11.下列对继承的描述中,错误的是()。
A.析构函数不能被继承B.派生类也是基类的组合C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变12.派生类的对象对它的基类成员中()是可以访问的。
A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员13.下列说法错误的是()。
A.公有继承的基类中的public成员在派生类中仍是public的B.公有继承的基类中的private成员在派生类中仍是private的C.私有继承的基类中的public成员在派生类中变成private的D.保护继承的基类中的public成员在派生类中变成protected的14.下面叙述错误的是( A )。
A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D. D. 基类的protected成员不能被派生类的对象访问15.C++类体系中,不能被派生类继承的有()。
A.构造函数B.虚函数C.静态成员函数D.赋值操作函数16.设置虚函数的声明中,正确的是()。
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码17.下列虚基类的声明中,正确的是()。
A.class virtual B:public AB.virtual class B:public AC.class B:public A virtualD.class B: virtual public A18.在下面的表达式中,不表示虚继承的是()。
A.virtual publicB.public virtualC.publicD. virtual19.C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。
A.复用B.继承C.封装D.引用20.继承具有(),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A.规律性B.传递性C.重复性D.多样性21.下列对继承的描述中,错误的是()。
A.析构函数不能被继承B.派生类也是基类的组合C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变22.派生类的对象对它的基类成员中()是可以访问的。
A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员23.下面叙述错误的是( A )。
A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D.基类的protected成员不能被派生类的对象访问24.设置虚函数的声明中,正确的是()。
A.简化程序B.消除二义性C.提高运行效率D.减少目标代码25.下列虚基类的声明中,正确的是()。
A.class virtual B:public AB.virtual class B:public AC.class B:public A virtualD.class B: virtual public A26.若要用派生类的对象访问基类的保护成员,以下观点正确的是( )A.不可能实现B.可采用保护继承C.可采用私有继承D.可采用公有继承27.设有基类定义:class base{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量c能被派生类的对象访问( )A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可28.下列虚基类的声明中,正确的是()。
A.class virtual B:public A B.virtual class B:public AC.class B:public A virtual D.class B: virtual public A二、填空题(共23分,每空1分)1.C++将类继承分为和两种。
2.派生类可以定义其_______________中不具备的数据和操作。
3.派生类构造函数的初始化列表中包含____________________________。
4.在继承机制下,当对象消亡时,编译系统先执行(1)的析构函数,然后才执行(2)的析构函数,最后执行(3)的析构函数。
5.设有以下类的定义:class Aclass B: protected Aclass C: private B{int A1;{ int b1;{ int c1;protected:int A2;protected: int b2;protected: int c2;public:int A3;public: int b3;public: int c3;};};};请按访问权限写出派生类C中具有的成员。
私有成员:(1)保护成员:(2)公有成员:(3)。
6.生成一个派生类对象时,先调用(1)的构造函数,然后调用(2)的构造函数。
7.继承发生在利用现有类派生新类时,其中(1)称为基类,或(2)类;(3)称为派生类,或(4)类。
8.在继承关系中,(1)称为多重继承,(2)称为多层继承。
9.在公有继承关系下,派生类的对象可以访问基类中的(1)成员,派生类的成员函数可以访问基类中的(2)成员。
10.在保护继承关系下,基类的公有成员和保护成员将成为派生类中的(1)成员,它们只能由派生类的(2)来访问;基类的私有成员将成为派生类中的(3)成员。
三、改错题(共6分,每题3分)1.指出并改正下面程序中的错误。
#include<iostream.h>class Point{ intx,y;public:Point(int a=0,int b=0) {x=a; y=b;}void move(intxoffset,intyoffset) {x+=xoffset; y+=yoffset;}intgetx() {return x;}intgety() {return y;}};class Rectangle:protected Point{ intlength,width;public:Rectangle(intx,inty,intl,int w):Point(x,y){ length=l;width=w;}intgetlength(){return length;}intgetwidth(){return width;}};void main(){ Rectangle r(0,0,8,4);r.move(23,56);cout<<r.getx()<<","<<r.gety()<<","<<r.getlength()<<","<<r.getwidth()<<endl;}2.#include<iostream.h>class A{ public:int x;A(int a=0) {x=a;}void display() { cout<<"A.x="<<x<<endl; }};class B{ public:int x;B(int a=0) {x=a;}void display() {cout<<"B.x="<<x<<endl; }};class C:public A,public B{ int y;C(inta,intb,int c) :A(a),B(b){ y=c; }intgety() { return y; }};void main(){ C myc(1,2,3);myc.x=10;myc.display();}四、看程序写结果(共16分,每题4分)1.#include <iostream.h>class Base{ int i;public:Base(int n){cout<<"Constucting base class" <<endl;i=n;}~Base(){cout<<"Destructing base class" <<endl;}void showi(){cout<< i<< ",";}intGeti(){return i;}};class Derived:public Base{ int j;Base aa;public:Derived(intn,intm,int p):Base(m),aa(p){cout<< "Constructing derived class" <<endl;j=n;}~Derived(){cout<<"Destructing derived class"<<endl;}void show(){Base::showi();cout<< j<<"," <<aa.Geti() <<endl;}};void main(){ Derived obj(8,13,24);obj.show();}2.#include<iostream.h>class A{ public:A(char *s) { cout<<s<<endl; }~A() {}};class B:virtual public A{ public:B(char *s1, char *s2):A(s1){ cout<<s2<<endl; }};class C: virtual public A{public:C(char*s1,char *s2):A(s1){cout<<s2<<endl;};class D:public B,public C{public:D(char *s1, char *s2,char *s3, char *s4):B(s1,s2),C(s1,s3),A(s1){cout<<s4<<endl;}};void main(){D *p=new D("class A","classB","classC","class D");delete p;}3.#include<iostream.h>class parent{ int i;protected:int x;public:parent( ) {x=0; i=0;}void change( ) {x++; i++; }void display();};class son: public parent{ public:void modify();};void parent:: display(){cout<<"x="<<x<<endl; }void son::modify(){x++; }void main(){son A; parent B;cout<<"Display derived class object A:\n";A.display();A.change();A.display();A.modify();A.display();cout<<"Display base class object B:\n";B.change(); B.display();}4.#include<iostream.h>class base{ public:void show() {cout<<"class base show() is called.\n"; }};class derived: public base{ public:void show() {cout<<"class derived show() is called.\n"; }};void main(){base demo1;derived demo2;demo1.show();demo2.show();demo2.base::show();}五、编程题(共27分,每题9分)1.建立一个基类Building ,用来存储一座楼房的层数、房间数以及它的总平方英尺数。