内容发布更新时间 : 2024/12/25 13:19:44星期一 下面是文章的全部内容请认真阅读。
第8章练习题
同步练习8.1
1.一个大的应用程序,通常由多个类构成,类与类之间互相协同工作, 它们之间有三种主要关系。下列不属于类之间关系的是()。
(A)gets-a (A)自反性
(B)has-a (B)对称性
(C)uses-a (C)传递性
(D)is-a (D)反对称性
2.在C++中,类之间的继承关系具有()。 3.下列关于类之间关系的描述,正确的是()。
(A)has-a表示一个类部分地使用另一个类 (B)uses-a表示类的包含关系 (C)is-a关系具有对称性。 (A)父类具有子类的特征 (C)is-a关系具有传递性
(D)is-a机制称为“继承” (B)一个类只能从一个类继承 (D)uses-a表示类的继承机制
4.下列关于类的描述,正确的是()。
5.下列关于类的继承描述中,正确的是()。
(A)派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。 (B)派生类也是基类,所以它们是等价的。
(C)派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。 (D)一个基类可以有多个派生类,一个派生类可以有多个基类。 【解答】
A
C
D
C
D
同步练习8.2
一、选择题
1.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的()。 (A)public成员 (A)public成员 (A)public成员 (A)public成员 (A)public (A)私有成员
员
7.下列关于类层次中重名成员的描述,错误的是()。 (A)C++允许派生类的成员与基类成员重名
(B)在派生类中访问重名成员时,屏蔽基类的同名成员 (C)在派生类中不能访问基类的同名成员
(D)如果要在派生类中访问基类的同名成员,可以显式地使用作用域符指定 8.下列关于类层次中静态成员的描述,正确的是()。 (A)在基类中定义的静态成员,只能由基类的对象访问
(B)private成员 (B)private成员 (B)private成员 (B)private成员 (B)private
(C)protected成员 (C)protected成员 (C)protected成员 (C)protected成员 (C)protected (C)保护成员
(D)友元 (D)友元 (D)友元 (D)所有成员 (D)public或protected (D)保护成员或私有成
2.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的()。 3.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的()。 4.不论派生类以何种方式继承基类,都不能直接使用基类的()。 5.在C++中,不加说明,则默认的继承方式是()。
6.某公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的()。
(B)公有成员
(B)在基类中定义的静态成员,在整个类体系中共享
(C)在基类中定义的静态成员,不管派生类以何种方式继承,在类层次中具有相同的访问性质 (D)一旦在基类中定义了静态成员,就不能在派生类中再定义
【解答】 A
B C B B A C B
同步练习8.3
一、选择题
1.在C++中,可以被派生类继承的函数是()。 (A)成员函数
(B)构造函数
(C)析构函数
(D)友元函数
2.下列关于派生类对象的初始化,叙述正确的是()。 (A)是由派生类的构造函数实现的 (B)是由基类的构造函数实现的 (C)是由基类和派生类的构造函数实现的 (D)是系统自动完成的,不需要程序设计者干预 3.在创建派生类对象时,构造函数的执行顺序是()。
(A)对象成员构造函数—基类构造函数—派生类本身的构造函数 (B)派生类本身的构造函数—基类构造函数—对象成员构造函数 (C)基类构造函数—派生类本身的构造函数—对象成员构造函数 (D)基类构造函数—对象成员构造函数—派生类本身的构造函数 4.在具有继承关系的类层次体系中,析构函数执行的顺序是()。 (A)对象成员析构函数—基类析构函数—派生类本身的析构函数 (B)派生类本身的析构函数—对象成员析构函数—基类析构函数 (C)基类析构函数—派生类本身的析构函数—对象成员析构函数 (D)基类析构函数—对象成员析构函数—派生类本身的析构函数 5.在创建派生类对象时,类层次中构造函数的执行顺序是由()。 (A)派生类的参数初始式列表的顺序决定的 (C)是由类的书写顺序决定的
(B)系统规定的 (D)是任意的
【解答】 A
C
D B B
同步练习8.5
一、选择题
1.当不同的类具有相同的间接基类时,()。
(A)各派生类无法按继承路线产生自己的基类版本
(B)为了建立唯一的间接基类版本,应该声明间接基类为虚基类 (C)为了建立唯一的间接基类版本,应该声明派生类虚继承基类 (D)一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类 2.下列关于多继承的描述,错误的是()。
(A)一个派生类对象可以拥有多个直接或间接基类的成员 (B)在多继承时不同的基类可以有同名成员
(C)对于不同基类的同名成员,派生类对象访问它们时不会出现二义性 (D)对于不同基类的不同名成员,派生类对象访问它们时不会出现二义性 3.下面关于基类和派生类的描述,正确的是()。
(A)一个类可以被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类
(B)一个类不能被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类 (C)一个类不能被多次说明为一个派生类的直接基类,且只能成为一次间接基类 (D)一个类可以被多次说明为一个派生类的直接基类,但只能成为一次间接基类 4.下列关于虚继承的说明形式的描述,正确的是()。 (A)在派生类类名前添加关键字virtual (C)在基类类名后添加关键字virtual 5.设置虚基类的目的是()。 (A)简化程序 【解答】 C
二、程序练习
1.阅读程序,写出运行结果。
#include
A(const char *s) { cout << s << endl; } ~A() {} };
class B : virtual public A { public :
B(const char *s1, const char *s2) : A( s1 ) { cout << s2 << endl; } };
class C : virtual public A { public :
C(const char *s1, const char *s2):A(s1) { cout << s2 << endl; } };
class D : public B, public C { public :
D( const char *s1,const char *s2,const char *s3,const char *s4 ): B( s1, s2 ), C( s1, s3 ), A( s1 ) { cout << s4 << endl; } }; int main()
{ D *ptr = new D( \ delete ptr; } 【解答】
C
B
(B)消除二义性 D
B
(C)提高运行效率 (D)减少目标代码
(B)在基类类名前添加关键字virtual
(D)在派生类类名后,类继承的关键字之前添加关键字virtual