您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页习题9继承和生

习题9继承和生

来源:筏尚旅游网



习题9 继承和派生

一、单项选择题

1C++语言建立类族是通过( )实现的。

A、类的嵌套 B、虚函数 C、类的继承 D、抽象类

2、继承具有( ),即当基类本身也是某一个类的派生类时,底层的派生类也会自动

继承间接基类的成员。

A、规律性 B、传递性 C、重复性 D、多样性

3、下列对基类和派生类关系的描述中,错误的是( )。

A、派生类是基类的具体化C、派生类是基类定义的延续

B、派生类是基类的子集
D、派生类是基类的组合

4、下列对派生类的描述中,错误的是( )。

A、一个派生类可以作为另一个派生类的基类
B、派生类至少有一个基类
C、派生类的缺省继承方式是private
D、派生类只继承了基类的公有成员和保护成员
)。5、下列关于继承的描述中,错误的是(
A、析构函数不能被继承
B、派生类是基类的组合
C、派生类的成员除了它自己的成员外,还包含了它的基类的成员D、派生类中继承的基类成员的访问权限到派生类保持不变

6、派生类的对象对它的基类成员中(A、公有继承的公有成员
C、公有继承的保护成员
7、下列说法中错误的是( )。

)是可以访问的。

B、公有继承的私有成员
D、私有继承的公有成员

A、公有继承时基类中的public 成员在派生类中仍是public B、公有继承时基类中的private 成员在派生类中仍是private C、私有继承时基类中的public 成员在派生类中是private D、保护继承时基类中的public 成员在派生类中是protected 8、下面叙述错误的是( )。

A、基类的protected 成员在派生类中仍然是protected
B、基类的protected 成员在public 派生类中仍然是protected C、基类的protected 成员在private 派生类中是private D、基类的protected 成员不能被派生类的对象访问
9、下面叙述错误的是( )。

A、对基类成员的访问能力在private 派生类中和public 派生类中是相同的



B、基类的private成员在public派生类中不可访问
C、基类中的public成员在protected派生类中是protectedD、基类中的public成员在protected派生类中仍然是public10C++体系中,不能被派生类继承的有( )。

C、静态成员函数 D、赋值操作函数A、构造函数 B、虚函数
11、派生类的构造函数的成员初始化列表中,不能包含( )。

A、基类的构造函数
C、基类中子对象的初始化

B、派生类中子对象的初始化
D、派生类中一般数据成员的初始化

12、多继承的构造顺序可分为如下4 步。

所有非虚基类的构造函数按照它们被继承的顺序构造;②所有虚基类的构造函数按照它们被继承的顺序构造;③所有子对象的构造函数按照它们声明的顺序构造;④派生类自己的构造函数体;

4 个步骤的正确顺序是(

)。

C、②①③④

D、③④①②

A、④③①②

B、②④③①

13、关于多继承二义性的描述中错误的是(

)。

A、一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义件
B、解决二义性的最常用的方法是对成员名的限定法
C、基类和派生类中同时出现的同名函数,也存在二义性问题
D、一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类;对该基类成员进行访问时,可能出现二义性

14、设置虚基类的目的是(

)。

C、提高运行效率

D、减少目标代码

A、简化程序

B、消除二义性

15、下列虚基类的声明中,正确的是(

)。



Aclass virtual B: public A Cclass B: public A virtual

Bvirtualclass B: public A
DclassB: virtual class A

16、带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,

这样将对虚基类的子对象初始化( )。

A、与虚基类下面的派生类个数有关 B、多次 C、两次 D、一次

17、下列关于虚基类的描述中,错误的是( )。

A、虚基类子对象的初始化由最派生类完成

B、虚基类于对象的初始化次数与虚基类下面的派生类个数有关

C、设置虚基类的目的是消除二义性

D、带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造

函数的调用

18、下列关于子类型的描述中错误的是( )。



A、子类型关系是可逆的

B、公有派生类的对象可以初始化基类的引用

C、只有在公有继承下,派生类是基类的子类型

D、子类型关系是可传递的

19、下面( )的叙述不符合赋值兼容规则。

A、派生类的对象可以赋值给基类的对象

B、基类的对象可以赋值给派生类的对象

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

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

20、下面叙述错误的是( )。

A、派生类可以使用private派生

B、对基类成员的访问必须是无二义性的

C、基类成员的访问能力在派生类中维持不变

D、赋值兼容规则也适用于多继承的组合

二、分析下列各程序的运行结果

1、源程序如下:

#include<iostream.h>
classPerson{
public:
Person(){ cout<<"Constructor of Person"<<endl;} ~Person(){ cout<<"Destructor of Person"<<endl;} };
classStudent: public Person{
public:
Student(){ cout<<"Constructor of Student"<<endl; } ~Student(){ cout<<"Destructor of Student"<<endl; }};
classTeacher: public Person{
public:
Teacher(){ cout<<"Constructor of Teacher"<<endl; } ~Teacher(){ cout<<"Destructor of Teacher"<<endl; }};
intmain(){
Students;
Teachert;
return0;
}

2、源程序如下:

#include<iostream.h>
classBase{



public:
Base(intxx=0):x(xx) { cout<<"Base's constructor."<<endl;} ~Base(){ cout<<"Base's destructor."<<endl;}
voidPrint() { cout<<x<<","; }
intGetX() { return x; }
private:
intx;
};
classDerived: public Base{
public:
Derived(intxx=0,int yy=0): Base(xx),y(yy),z(xx+yy){
cout<<"Derived'sconstructor."<<endl;
}
~Derived(){ cout<<"Derived's destructor."<<endl; } voidPrint() {
Base::Print();
cout<<y<<","<<z.GetX()<<endl;
}
private:
inty;
Basez;
};
intmain(){
Derivedobj1(2),obj2(4,6);
obj1.Print();
obj2.Print();
return0;
}

3、源程序如下:

#include<iostream.h>
classBase{
public:
intx;
voidPrint() { cout<<"Base::x is "<<x<<endl; }};
classDerived1: public Base{
public:
voidPrint() { cout<<"Derived1::x is "<<x<<endl;} };
classDerived2: private Base{
public:
Derived2(){ Base::x=4; }
intx;
voidPrint() {



cout<<"Derived2'sBase::x is "<<Base::x<<endl; cout<<"Derived2::xis "<<x<<endl;
}
};
intmain(){
BaseobjB;
Derived1objD1;
Derived2objD2;
objD2.x=1+(objD1.x=1+(objB.x=1));
objB.Print();
objD1.Print();
objD2.Print();
return0;
}

4、源程序如下:

#include<iostream.h>
classB{
public:
B(){ cout<<"class B"<<endl; }
};
classX: virtual public B{
public:
X(){ cout<<"class X"<<endl;
}};
classY: virtual public B{
public:
Y(){ cout<<"class Y"<<endl; }
};
classD: public X,public Y{
public:
D(){ cout<<"class D"<<endl; }
};
intmain(){
Dobj;
return0;
}

5、源程序如下:

#include<iostream.h>
classBase{
public:
voidWho() { cout<<"class Base"<<endl; }
};
classDerived1: public Base{
public:



voidWho() { cout<<"class Derived1"<<endl; }
};
classDerived2: public Base{
public:
voidWho() { cout<<"class Derived2"<<endl; }
};
intmain(){
Baseobj1,*p;
Derived1obj2;
Derived2obj3;
p=&obj1;
p->Who();
p=&obj2;
p->Who();
p=&obj3;
p->Who();
obj2.Who();
obj3.Who();
return0;
}

三、程序填空请将最合适的语句填入各标号处,使其成为一个完整、正确的程序

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

#include<iostream.h>
#include<math.h>
classPoint{
public:

Point(double a,double b,double c){

}




doubleGetx() { return X; }
doubleGety() { return Y; }
doubleGetz() { return Z; }
private:

protected:

};

class Line:

Point{



public:

Line(double a,double b,double c,double d)

{

}





voidshow()
{
cout<<Getx()<<endl;
cout<<Gety()<<""<<Y<<endl;
cout<<Getz()<<""<<Z<<endl;



cout<<K<<endl;
}
private:
doubleK;
};
intmain(){
Lineobj(1.2,3.4,5.6,7.8);
obj.show();
return0;
}

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

classPoint{
public:
Point(inti=0,int j=0){ X=i;Y=j; }
voidMove(int xOff,int yOff){ X+=xOff; Y+=yOff; } intGetX() { return X; }
intGetY() { return Y; }
private:
intX,Y;
};
classRectangle: private Point{
public:

Rectangle(int x,int y,int w,int h)

{

}

void Move(int xOff,int yOff){

}


int GetX() {

}





int GetY() {

}



int GetW() {

}



int GetH() {

}



private:
intW,H;
};
#include<iostream.h>
intmain(){
Rectanglerect(1,2,3,4);
rect.Move(5,6);
cout<<"Thedata of rect(X,Y,W,H):("
<<rect.GetX()<<","<<rect.GetY()<<","
<<rect.GetW()<<","<<rect.GetH()<<")"<<endl; return0;
}

3、在横线处填上适当的语句,完成程序。

#include<iostream.h>
classA{
public:



voidf(int i) { cout<<i<<endl; }
voidg() { cout<<"g"<<endl; }
};
classB:A{
public:
voidh(){ cout<<"h"<<endl; }

};
intmain()
{
Bd1;
d1.f(6);
.h();
return0;
}

4、判断fY3::fZ2::d中的各条语句是否正确。

classX{
public:
inta;
};
classY1:public X{
};
classY2:protected X{
};
classY3:private X{
private:
voidf(Y1* py1,Y2* py2, Y3* py3);
};
classZ2:public Y2{
private:
voidf(Y1* py1,Y2* py2, Y3* py3);
};
voidf(Y1* py1,Y2* py2, Y3* py3){

py1->a=7;

//

py2->a=7;

//

py3->a=7;

//

}
voidY3::f(Y1* py1,Y2* py2, Y3* py3){

py1->a=7;

//

py2->a=7;

//

py3->a=7;

//

}
voidZ2::f(Y1* py1,Y2* py2, Y3* py3){

py1->a=7;

//




py2->a=7;

//

py3->a=7;

//

}

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务