};
classDerived:
publicBase{
public:
voidfun()
{保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(C)
A)受限制B)保持不变C)受保护D)不受保护
5.在哪种派生方式中,派生类可以访问基类中的protected成员(B)
A)public和privateB)public、protected和private
C)protected和privateD)仅protected
6.当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C)
A)public成员B)private成员C)protected成员D)友元
7.不论派生类以何种方法继承基类,都不能使用基类的(B)
A)public成员B)private成员C)protected成员D)public成员和protected成员
8下面叙述错误的是(S)。
A)基类的protected成员在派生类中仍然是protected的
B)基类的protected成员在public派生类中仍然是protected的
C)基类的protected成员在private派生类中是private的
D)基类的protected成员不能被派生类的对象访问
9.下列说法中错误的是(S)。
A)保护继承时基类中的public成员在派生类中仍是public的
B)公有继承时基类中的private成员在派生类中仍是private的
C)私有继承时基类中的public成员在派生类中是private的
D)保护继承时基类中的public成员在派生类中是protected的
10下面叙述错误的是(C)。
A)派生类可以使用private派生
B)对基类成员的访问必须是无二义性的
C)基类成员的访问能力在派生类中维持不变
D)赋值兼容规则也适用于多继承的组合
11派生类的构造函数的成员初始化列表中,不能包含(C)。
A)基类的构造函数B)派生类中子对象的初始化
C)基类中子对象的初始化D)派生类中一般数据成员的初始化
12.下列虚基类的声明中,正确的是:
(B)
A)classvirtualB:
publicAB)classB:
virtualpublicA
C)classB:
publicAvirtualD)virtualclassB:
publicA
13..实现运行时的多态性采用(D)
A)重载函数B)构造函数C)析构函数D)虚函数
14.若一个类中含有纯虚函数,则该类称为(D)
A)基类B)纯基类C)派生类D)抽象类
15.假设A为抽象类,下列声明(B)是正确的
A)Afun(int);B)A*p;C)intfun(A);D)AObj;
16.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(B)
A)不同B)相同C)相容D)部分相同
17.下面函数原型声明中,(C)声明了fun为普通虚函数
A)voidfun()=0;B)virtualvoidfun()=0;
C)virtualvoidfun();D)virtualvoidfun(){};
18.在下面四个选项中,(A)是用来声明虚函数的。
A)virtualB)publicC)usingD)false
19.实现运行时的多态性要使用(D)。
A)重载函数B)构造函数
C)析构函数D)虚函数
20.关于虚函数的描述中,正确的是(D)。
A)虚函数是一个静态成员函数
B)虚函数是一个非成员函数
C)虚函数既可以在函数说明时定义,也可以在函数实现时定义
D)派生类的虚函数与基类中对应的虚函数具有相同的参数个数和类型
二、填空题:
1.派生类对基类的继承有三种方式:
_public___、_protected___和__private___。
2.如果类Alpha继承了类Beta,则类Alpha称为__派生__类,类Beta称为__基_类。
3.设置虚基类的目的是为了消除二义性,可通过_virtual标识虚基类。
4.类继承中,缺省的继承方式是__private_________。
5.当用protected继承从基类派生→个类时,基类的public成员成为派生类的_protected__________成员,protected成员成为派生类的_protected________成员。
6.指向基类的对象的指针变量也可以指向__公有派生类的对象。
三、程序题
1.继承的工作方式,完成以下代码。
要求:
(1)处继承方式为共有继承public,
(2)处填写基类的ai,(3)处填写派生类的bi,(4)对象b的数据成员有哪些?
ai,bi
#include<>
#include<>
classA{
public:
A(){ai=1;}
protected:
intai;
};
classB:
_____A{
public:
B(){bi=2;}
voiddisplay(){cout<<____
(2)____<<____(3)____<private:
intbi;
};
intmain()
{
Bb;
();
}
2.派生类的构造。
派生类的构造总是由基类的初始化开始的。
填写代码,完成基类的初始化。
并且要求屏幕输出效果是:
#include<>
classA{
public:
A(inti){x=i;cout<<"CA:
"<~A(){cout<<"DA"<private:
intx;
};
classB:
publicA{
public:
B():
_A(90)_{y=0;cout<<"CB"<~B(){cout<<"DB"<private:
inty;
};
intmain()
{
Bb;
}
3.填写初始化列表,完成以下程序,使得屏幕输出:
#include<>
classA{
public:
A(inti){x=i;cout<private:
intx;
};
classD{
public:
D(inti){m=i;cout<private:
intm;
};
classB:
publicA{
public:
B():
_A(90),d(19)
{y=0;}
private:
inty;
Dd;
};
intmain()
{
Bb;
}
4.请问以下程序输出什么?
#include<>
classA{
public:
A(inti){x=i;}
intx;
};
classB:
publicA{
public:
B(inti):
A(i+1){y=i;}
inty;
};
voidf1(A&ra)
{
cout<<<}
voidf2(A*pa)
{
cout<x<}
intmain()
{
Bb(3);
f1(b);
f2(&b);
}
4答案:
5.请问以下程序输出什么?
#include<>
classA{
public:
voiddisplay(){cout<<"A"<};
classB:
publicA{
public:
voiddisplay(){cout<<"B"<};
voidf(A&r)
{
();
}
intmain()
{
Bb;
f(b);
Aa;
f(a);
}
5.答案:
6.多态性,虚函数。
请问以下程序输出什么?
#include<>
classA{
public:
virtualvoiddisplay(){cout<<"A"<};
classB:
publicA{
public:
virtualvoiddisplay(){cout<<"B"<};
voidf(A&r)
{
();
}
intmain()
{
Bb;
f(b);
Aa;
f(a);
}
6.答案:
7.请问以下程序输出什么?
#include<>
classA{
public:
virtualvoiddisplay(){cout<<"A"<};
classB:
publicA{
public:
virtualvoiddisplay(){cout<<"B"<};
classC:
publicA{
public:
virtualvoiddisplay(){cout<<"C"<};
intmain()
{
Aa,aa;
Bb;
Cc,cc,ccc;
A*pa[6]={&a,&aa,&b,&c,&cc,&ccc};
inti=0;
for(i=0;i<6;++i)
pa[i]->display();
}
答案:
8.以下程序的屏幕输出是:
。
为何以下程序的屏幕输出中会输出DA呢?
请说明。
#include<>
classA{
public:
~A(){cout<<"DA";}
};
classB:
publicA{
public:
~B(){cout<<"DB";}
};
intmain()
{
Bb;
}
答案:
定义类B对象b时,先调用基类A的构造函数,再调用派生类类B的构造函数。
析构时正好相反,先析构B类,再析构A类。
1答案:
(1)public
(2)ai(3)bi(4)ai、bi
2.答案:
A(90)
3.答案:
A(90),d(19)
4答案:
5.答案:
6.答案:
7.答案:
8.答案:
定义类B对象b时,先调用基类A的构造函数,再调用派生类类B的构造函数。
析构时正好相反,先析构B类,再析构A类。
选择
CBCCBCBAACCBDDBBCADD
填空:
、___protected__和___private
2.派生,基类
3.为了消除二义性virtual
4.private
5._protected_protected
6.公有派生类