C++网络作业5答案

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、选择题
1.C++语言建立类族是通过_________实现的。

C
A)类的嵌套 B)虚函数 C)类的继承 D)抽象类
2. C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过________派生出新的类。

B
A)复用 B)继承 C)封装 D)引用
3. 继承具有_____,即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。

B
A)规律性 B)传递性 C) 重复性 D)多样性
在一个类的派生类中,其成员有两部分构成:一部分是从基类继承得到的,另一部分是自己定义的新成员。

当基类本身也是一个派生类时,它必然包含了它的直接基类的成员,这些成员相应地也存在于该基类的派生类中。

因此,继承是具有传递性的。

4. __①A__提供了类对外部的接口, __②B ___是类的内部实现,而__③D ___不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口。

A)公有成员B)私有成员C)私有成员函数D)保护成员
5. 下列对基类和派生类关系的描述中,错误的是___________。

B
A)派生类是基类的具体化
B)派生类是基类的子集
C)派生类是基类定义的延续
D)派生类是基类的组合
派生类包含基类中的成员,它是对基类定义的扩充和延续,是对基类定义的进一步具体化,而不是基类的子集。

6.下列对派生类的描述中,错误的是__________。

D
A)一个派生类可以作为另一个派生类的基类
B)派生类至少有一个基类
C)派生类的缺省继承方式是private
D)派生类只继承了基类的公有成员和保护成员//继承了基类的所有成员
7. 下列关于继承的描述中,错误的是_________。

D
A)析构函数不能被继承
B)派生类是基类的组合
C)派生类的成员除了它自己的成员外,还包含了它的基类的成员
D)派生类中继承的基类成员的访问权限到派生类保持不变
派生类不能继承基类的构造函数和析构函数,也不能访问基类的私有成员,而对基类的公有成员和保护成员的访问权限随着派生类对基类的继承方式而改变。

8.派生可以分为___①A _和_②C _。

由___②_得到的派生类,其基类的所有公有成员都只
能成为它的私有成员,这些私有成员只能被派生类的成员函数访问,而___③B _无权访问;由___①___得到的派生类,其基类中所有公有成员在派生类中也都是公有的。

A)公有派生B)派生类的实例
C)私有派生D)派生类的构造函数
对于公有继承方式:
·基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

这里保护成员与私有成员相同。

·基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态;基类的私有成员不可见:基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。

·基类成员对派生类对象的可见性对派生类对象来说,基类的公有成员是可见的,其他成员是不可见。

所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。

对于私有继承方式:
·基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

·基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。

·基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。

对于保护继承方式:
这种继承方式与私有继承方式的情况相同。

两者的区别仅在于对派生类的成员而言,·基类成员对其对象的可见性与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。

·基类成员对派生类的可见性对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员
都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。

·基类成员对派生类对象的可见性对派生类对象来说,基类的所有成员都是不可见的。

所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再往下继承。

9.基类的__①B ___不能为派生类的成员访问,基类的___②A ___在派生类中的性
质和继承的性质一样,基类的___③D___在私有继承时在派生类中成为私有成
员函数,在公有和保护继承时在派生类中仍为保护成员函数。

A)公有成员B)私有成员C)私有成员函数D)保护成员函数
10. 派生类的对象对它的基类成员中__A____是可以访问的。

A)公有继承的公有成员B)公有继承的私有成员
C)公有继承的保护成员D)私有继承的公有成员
11. 下列说法中错误的是_________。

B
A)公有继承时基类中的public成员在派生类中仍是public的
B)公有继承时基类中的private成员在派生类中仍是private可见的
C)私有继承时基类中的public成员在派生类中是private的
D)保护继承时基类中的public成员在派生类中是protected的
基类的私有成员在在派生类中是隐藏的,是不可见的,派生类不可访问基类中的私有成员。

12. 下面叙述错误的是_________:A
A)基类的protected成员在派生类中仍然是protected的
B)基类的protected成员在public派生类中仍然是protected的
C)基类的protected成员在private派生类中是private的
D)基类的protected成员不能被派生类的对象访问
参考第八题说明
14. C++类体系中,不能被派生类继承的有________。

A
A)构造函数 B)虚函数 C)静态成员函数 D)赋值操作函数
派生类不能继承基类的构造函数和析构函数
15. 派生类的构造函数的成员初始化列表中,不能包含________。

C
A)基类的构造函数
B)派生类中子对象的初始化
C)基类中子对象的初始化
D)派生类中一般数据成员的初始化
派生类的构造函数只负责对基类成员(调用基类的构造函数)、新定义的子对象成员和一般数据成员进行初始化
16 多继承的构造顺序可分为如下4步:C
①所有非虚基类的构造函数按照它们被继承的顺序构造;
②所有虚基类的构造函数按照它们被继承的顺序构造;
③所有子对象的构造函数按照它们声明的顺序构造:
④派生类自己的构造函数体:
这4个步骤的正确顺序是_______。

A)④③①② B)②④③① c)②①③④ D)③④①②
参考课本P387及例题
17 关于多继承二义性的描述中,错误的是___________。

C
A) 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访可能出现
二义性
B)解决二义性的最常用的方法是对成员名的限定法
C)基类和派生类中同时出现的同名函数,也存在二义性问题
D)一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类.对该基类
成员进行访问时,可能出现二义性
基类和派生类中同时出现的同名函数,若其形参个数、类型都一致则基类的被派生类的覆盖,否则可看作函数重载。

18.设置虚基类的目的是_______。

B
A)简化程序
B)消除二义性
C)提高运行效率
D)减少目标代码
19. 下列虚基类的声明中,正确的是________。

D
A) class virtua1 B:public A
B) virtual class B:public A
C) class B:public A virtual
D) c1ass B:virtual public A
20. 带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化________。

D
A)与虚基类下面的派生类个数有关 B)多次 C)两次 D)一次
24. 下面_______的叙述不符合赋值兼容规则。

B
A)派生类的对象可以赋值给基类的对象
B)基类的对象可以赋值给派生类的对象
C)派生类的对象可以初始化基类的引用
D)派生类的对象的地址可以赋值给指向基类的指针
赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。

通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。

这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。

赋值兼容规则中所指的替代包括以下的情况:·派生类的对象可以赋值给基类对象。

·派生类的对象可以初始化基类的引用。

·派生类对象的地址可以赋给指向基类的指针。

在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。

参考光盘讲义第13章第10节
26. 下列程序巾,划线处正确的语句是_______:C
#include <iostream.h>
class Base
{
public:
void fun(){ cout<<"Base::fun"<<endl; }
};
class Derived public Base
{
void fun()
{
_______________ //显式调用基类的函数fun()
cout<<"Derived::fun"<<endl;
}
};
A) fun(); B) Base.fun(); C) Base::fun(); D) Base->fun();
程序中要求显式调用某个类的成员时,必须使用成员名限定符(域区分符)。

其一般格式为〈类名>.<成员名> 或〈类名>.<成员名>(<参数表>)
27. 下列程序中,编译时不会出错的语句是_________________A
#include <iostream.h>
class Base
{
public:
Base() { }
Base(int i) { data=i; }
private:
int data;
};
class Derived: public Base
{
public:
Derived() :Base(0) {}
Derived(int x): Base(x) { }
};
void main()
{
Derived d1(1);
Base *pb,b1;
pb=&d1; //A
d1=b1; //B
Base &refB=d1;
Derived d2=*pb; //C
Derived &refD=refB; //D
}
公有继承时:
派生类的对象可以赋值给基类的对象,即用派生类从基类继承来的成员,逐个赋值给基类对象的成员。

反之则出错。

派生类的对象可以初始化基类的引用。

反之则出错。

派生类的对象地址可以赋值给指向基类的指针。

反之则出错。

不用虚函数时,后两种情况的基类的指针和引用只能访问派生类中从基类继承来的成员
二、填空题
28 派生类对基类的继承有三种方式:_①公有继承public___、__②私有继承private____和__③_保护继承protected _____。

29 类继承中,缺省的继承方式是private______。

30 如果类Alpha继承了类Beta,则类Alpha称为①派生类类,类Beta称为_②基类_类。

31 C++提供的_多继承_机制允许一个派生类继承多个基类,即使这些基类是相互无关的。

32 利用继承能够实现__软件复用。

这种实现缩短了程序的开发时间,促使开发人员复用
已经测试和调试好的高质量软件。

33若类Y是类X的私有派生类,类Z是类Y的派生类,则类Z_不能_访问类X的保护成员与公有成员。

34 当用protected继承从基类派生一个类时,基类的public成员成为派生类的protected
成员,protected成员成为派生类的_protected_成员。

35 多继承情况下,派生类的构造函数的执行顺序取决于_______定义_派生类时所指定的各
基类的顺序。

36 构造函数___①不能_____被继承,析构函数____②不能_____被继承。

37 对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行__①基类的构造函数__,再执行_②子对象的构造函数___,最后执行___③派生类本身的构造函数体__。

38对基类数据成员的初始化必须在派生类构造函数中的_成员初始化列表__处执行。

在派生类构造函数中,对基类数据成员的初始化必须在成员初始化列表中进行,新增成员
的初始化既可以在成员初始化列表中进行,也可以构造函数体中进行。

39 当撤消一个含有基类和子对象成员的派生类对象时,将首先完成_①_派生类__的析
构函数定义体的执行,接着完成 _②子对象的__的析构函数定义体的执行,最后完成_③基类__的析构函数定义体的执行。

派生类的析构函数的执行过程与派生类的构造函数的执行过程严格相反。

40 ___①_多___继承情况下,派生类中对基类成员的访问会出现二义性。

解决二义性的
方法是__②成员名限定法_____和___③虚基类_____。

41 在派生类中使用基类的成员,可以显式地使用_成员名限定符_来使用基类成员。

43 设置虚基类的目的是_①解决二义性问题_,可通过②关键字virtual _标识虚基类。

44 指向基类的对象的指针变量也可以指向__________的对象。

派生类
46 ___①派生类_____类的对象可作为___②基类____类的对象处理。

47 在划线处填上适当的语句,完成下列程序。

#include<iostream.h>
#include <math.h>
class Point
{
public:
Point(double a, double b, double c) {__①X=a;Y=b;Z=c; }
double Getx( ) {return X; }
double Gety( ) { return Y; }
double Getz() { return Z; }
private:
____②double X _______
protected:
____③double Y, Z;_______
};
class Line:___④public _ Point
{
public:
Line(double a,double b,double c,double d)⑤:point(a,b,c){_⑥K=d;}
void show()
{
cout<<Getx()<<endl;
cout<<Gety()<<" "<<Y<<endl;
cout<<Getz()<<" "<<Z<<endl;
cout<<K<<endl;
}
private:
double K;
};
void main()
{
Line obj(1.2,3.4,5.6,7.8);
obj.show( );
}
注意:protected成员与private成员的区别,
对派生类Line来说,基类Point的保护成员Y和Z是可见的:基类Point的私有成员X是不可见的:派生类不可访问基类中的私有成员X。

48 判断f,Y::f,Z2::f 中的各条语句是否正确。

class X
{
public:
int a;
};
class Y1: public X
{
};
class Y2: protected X
{
};
class Y3: private X
{
private:
void f(Yl* pyl,Y2* py2,Y3* py3);
};
class Z2: public Y2
{
private:
void f(Y1* pyl,Y2* py2,Y3* py3);
}
void f(Yl* pyl,Y2* py2,Y3* py3)
{
pyl->a=7; //__①正确__
py2->a=7; //___②错误__
py3->a=7; //__③错误____
}
void Y3::f(YI* pyl,Y2* py2,Y3* py3)
{
pyl->a=7; //__④正确____
py2->a=7; //__⑤错误____
py3->a=7; //__⑥正确_____
}
void Z2::f(YI* pyl,Y2* py2,Y3* py3)
{
pyl->a=7; //__⑦正确_____
py2->a=7; //___⑧错误____
py3->a=7; //__⑨错误_____
}
派生类Y1从基类X公有继承,基类X成员a在Y1中仍然是public,所以Y1类型的指针py1可以访问a成员。

因此①、④、⑦正确。

派生类Y2从基类X保护继承.,X成员a在Y2中变为protected,保护成员不能在类体外被访问,因此在普通函数f及Y3的成员f函数的函数体内,不能通过Y2类型的指针py2访问a成员,②和⑤错误。

派生类Z2从派生类Y2公有继承,基类成员a在Z2中变为保护成员,因此a 成员可以在Z2的类体内被直接访问,或通过Z2类体内的Z2类对象被访问,而不能通过类Z2的基类Y2的对象进行访问,因此⑧错误。

派生类Y3从基类X私有继承,基类成员a在Y3中变为私有成员,只能在Y3的类体内进行访问,在Y3的成员函数f中,Y3类型的指针py3可以访问a成员,此时仍然是在类Y3的类体内,因此⑥正确。

但在普通函数f及Z2的成员f函数的函数体内,不能通过py3访问a成员,因此③和⑨错误。

49 根据基类的定义和测试程序,完成下面派生类的定义。

class Point
{
public:
Point(int i=0,int j=0) {X=i, Y=j; }
void Move(int xOff, int yOff) {X+=xOff; Y+=yOff; }
int GetX() {return X; }
int GetY() {return Y;}
private:
int X,Y;
};
class Rectangle: private Point
{
public:
Rectangle(int x,int y,int w,int h)_①:Point(x,y)_{_②W=w; H=h;}
void Move(int xOff, int yOff) {___③Point::Move(xOff,yOff);_____}
int GetX(){____④return Point::GetX( );__}
int GetY(){_____⑤return Point::GetY( ); __}
int GetW(){_____⑥return W;___}
int GetH(){_____⑦return H;__}
private:
int W,H;
};
#include <iostream.h>
#include <math.h>
void main()
{
Rectangle rect(1,2,3,4);
rect.Move(5,6);
cout<<"The data of rect(X,Y,W,H):(”
<<rect.GetX()<<","<<rect.GetY()<<","
<<rect.GetW()<<","<<rect.GetH0<<")"<<endl;
}
注意在私有继承时,为了使派生类的对象可以访问基类的成员,必须在派生类中声明同名的成员。

在类中定义同名成员有两种方法:
void f(){A::f();} 或 A::f;
50 在横线处填上适当的语句,完成程序。

#include <iostream.h>
class A
{
public:
void f( int i) { cout<<i<<endl; }
void g( ) { cout<<"g"<<endl; }
};
class B: A
{
public:
void h(){ cout<<"h"<<endl; }
____①A::f _____;
};
void main()
{
B d1;
d1.f(6);
___②d1____.h( );
}
参考上题注释。

作业5答案:
一,选择题:
1 C
2 B
3 B4①A ②B ③D 5 B 6D 7D 8 ①A ②C ③B
9 ①B ②A ③D 10 A 11 B 12 A 14 A 15 C 16 C 17 C 18 B
19 B 20 D 24 B 26 C 27 A
二,填空题:
28 ①公有继承public ②私有继承private ③保护继承protected
29 private
30 ①派生类②基类
31 多继承
32 软件复用
33不能
34 protected protected
35 定义
36 ①不能②不能
37 ①基类的构造函数②子对象的构造函数③派生类本身的构造函数体
38 成员初始化列表
39 ①派生类②子对象的③基类
40 ①多②成员名限定法③虚基类
41 成员名限定符
43 ①解决二义性问题②关键字virtual
44 派生类
46 ①派生类②基类
47 ①X=a;Y=b;Z=c; ②double X ③double Y, Z; ④public
⑤:point(a,b,c) ⑥K=d;
48 ①正确②错误③错误④正确⑤错误⑥正确⑦正确⑧错误⑨错误
49 ①:Point(x,y) ②W=w; H=h; ③Point::Move(xOff,yOff);
④return Point::GetX( ); ⑤return Point::GetY( ); ⑥return W; ⑦return H;
50 ①A::f ②d1。

相关文档
最新文档