一、选择题
下面叙述错误的是(A)
A.基类的protected成员在派生类中仍然是protected
B.基类的protected成员在public派生类中仍然是protected的
C.基类的protected成员在private派生类中是private的
D.基类的protected成员不能被派生类的对象访问
解析:
权限运算规则:
public > protecetd > private
(继承方式 与 基类中权限 )取交集 = 派生类中权限
2、下列对派生类的描述中,(D)是错误的。
A.一个派生类可以作为另一个派生类的基类
B.派生类至少有一个基类
C.派生类的成员除了它自己的成员外,还包含了它的基类成员
D.派生类中继承的基类成员的访问权限到派生类保持不变
3、派生类的对象对它的哪一类基类成员是可以访问的?(A)
A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员
C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员
4、关于多继承二义性的描述,(D)是错误的。
A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性
B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性
C.解决二义性最常用的方法是作用域运算符对成员进行限定
D.派生类和它的基类中出现同名函数时,将可能出现二义性
派生类和它的基类中出现同名函数,如果与基类中虚函数同名,则是覆盖。
如果和非虚函数同名,则是隐藏。
5、设有基类定义:
class Base
{
private:
int a;
protected:
int b;
public:
int c;
};
派生类采用何种继承方式可以使成员变量b成为自己的私有成员( A )
A. 私有继承 B.保护继承C. 公有继承 D.私有、保护、公有均可
二、填空题
1、在继承机制下,当对象消亡时,编译系统先执行[ 派生类 ] 的析构函数,然后才执行 [ 派生类中成员对象 ] 的析构函数,最后执行 [基类] 的析构函数。
三、改错题以及写结果题。
1、指出并改正下面程序中的错误。
#include<iostream>
using std::cout;
using std::endl;
class Point
{
public:
Point(int a=0, int b=0)
{
x = a;
y = b;
}
void move(int xoffset,int yoffset)
{
x += xoffset;
y += yoffset;
}
int getx()
{
return x;
}
int gety()
{
return y;
}
private:
int x,y;
};
class Rectangle
:protected Point
{
public:
Rectangle(int x, int y, int l, int w)
: Point(x,y)
{
length = l;
width = w;
}
int getLength()
{
return length;
}
int getWidth()
{
return width;
}
private:
int length;
int width;
};
int main()
{
Rectangle r(0, 0, 8,4);
r.move(23,56);
cout << r.getx()
<< "," << r.gety()
<< "," << r.getlength()
<< "," << r.getwidth() << endl;
return 0;
}
答:三处错误:
1.protected---->public
2.r.getlength() -->r.getLength();
3.r.getwidth() --->r.getWidth();
2、指出并改正下面程序中的错误。
#include<iostream>
using std::cout;
using std::endl;
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;