A.公有继承的公有成员 B.保护继承的公有成员 C.私有继承的公有成员 D.公有继承的保护成员 5.下列描述中,错误的是( D )。
A.基类的protected成员在public派生类中仍然是protected成员 B.基类的private成员在public派生类中是不可访问的 C.基类public成员在private派生类中是private成员 D.基类public成员在protected派生类中仍是public成员
6.派生类构造函数的成员初始化列表中,不能包含的初始化项是( B )。 A.基类的构造函数 B.基类的子对象 C.派生类的子对象 D.派生类自身的数据成员 7.下列关于子类型的描述中,错误的是( B )。 A.在公有继承下,派生类是基类的子类型
B.如果类A是类B的子类型,则类B也是类A的子类型 C.如果类A是类B的子类型,则类A的对象就是类B的对象 D.在公有继承下,派生类对象可以初始化基类的对象引用 8.下列关于多继承二义性的描述中,错误的是( D )。
A.一个派生类的多个基类中出现了同名成员时,派生类对同名成员的访问可能出现二
义性
B.一个派生类有多个基类,而这些基类又有一个共同的基类,派生类访问公共基类成
员时,可能出现二义性
C.解决二义性的方法是采用类名限定
D.基类和派生类中同时出现同名成员时,会产生二义性
8.3 填空题
1.继承的3种方式是 公有 、 私有 和 保护 。
2.如果类A继承了类B,则类A被称为 派生 类,类B被称为 基 类。
3.在保护继承方式下,基类的public成员成为派生类的 保护 成员,基类的protected成员成为派生类的 保护 成员。
4.当一个派生类中含有子对象时,该派生类的析构函数中应包含 直接基类 的析构函数、 子对象类的 析构函数和 自身类 的析构函数。
5.派生类的构造函数的成员初始化列表中可以包含的初始化项有 基类的构造函数 、 子对象类的构造函数 、 常数据成员 和 派生类其他非静态数据成员 。
8.4 分析下列程序的输出结果 1.
#include
public:
A(int i,int j)
{ a1=i;a2=j; } void Move(int x,int y) { a1+=x;a2+=y; } void Print()
{ cout<<'('< class B:private A { public: B(int i,int j,int k,int l):A(i,j) { b1=k;b2=l; } 21 void Print() { cout< { A::Print(); } void fun() { Move(5,8); } private: int b1,b2; }; void main() { A a(11,12); a.Print(); B b(31,32,33,34); b.fun(); b.Print(); b.f(); } 答: (11,12) 33.34 (36,40) 2. #include public: void InitA(int i,int j) { a1=i;a2=j; } void Move(int x,int y) { a1+=x;a2+=y; } int Geta1() { return a1; } int Geta2() { return a2; } private: int a1,a2; }; class B:public A { public: void InitB(int i,int j,int k,int l) { InitA(i,j); b1=k; b2=l; } void Move(int x,int y) { b1+=x;b2+=y; } int Getb1() { return b1; } int Getb2() { return b2; } private: int b1,b2; }; class C:public B { public: void fun() { Move(10,15); } 22 }; void main() { C c; c.InitB(11,12,13,14); c.fun();