本文格式为Word版,下载可任意编辑继承与派生习题 C++讲义-第九章习题 一.选择题 1.以下对派生类的描述中,错误的是( ) A.一个派生类可以作为另一个派生类的基类 B.派生类至少有一个基类 C.派生类的成员除了它自己的成员之外,还包含了它的基类的成员 D.派生类中继承的基类成员的访问权限到派生类保持不变 2.派生类的对象对它的基类成员中,可以访问的是( ) A.公有继承的公有成员 B.公有继承的私有成员 C.公有继承的养护成员 D.私有继承的公有成员 3.对基类和派生类的关系描述中,错误的是( ) A.派生类是基类的概括化 B.派生类是基类的子集 C.派生类是基类定义的延续 D.派生类是基类的组合 4.派生类的构造函数的成员初始化列表中,不能包含的是( ) A.基类的构造函数 B.派生类中子对象的初始化 C.基类的子对象初始化 D.派生类中一般数据成员的初始化 5.关于子类型的描述中,错误的是( ) A.子类型就是指派生类是基类的子类型 B.一种类型当它至少供给了另一种类型的行为,那么这种类型是另一种类型的子类型。
C.在公有继承下,派生类是基类的子类型 D.子类型关系是不成逆的 6.关于多继承二义性的描述中,错误的是( ) A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能展现二义性 B.解决二义性的常用方法是对成员名举行类名限定 C.基类和派生类中同时展现的同名函数,也存在二义性问题 D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员 举行访问时,也可能展现二义性 7.设置虚基类的目的是( ) A.简化程序 B.消释二义性 C.提高运行效率 D.裁减目标代码 8.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化的次数为( ) A.与虚基类下面的派生类个数有关 B.屡屡 第 1 页 共 15 页 C.二次 D.一次 9.C++中的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过( ),派生出新的类。
A.复用 B.继承 C.单继承 D.多继承 10.当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员,这种特性是继承的( ) A.规律性 B.传递性 C.重复性 D.多样性 11.若类A与类B的定义如下: class A { int i,j; public: void get(); //..... }; class B:A { int k; public: void make() { k=i*j; } //.... }; 那么上述定义中,非法的是( ) A.void get(); B.int k; C.void make() D.k=i*j; 12.在派生类中定义的析构函数与它所属的基类的关系是( ) A.确定有关 B.确定无关 C.以上都不对 13.在多继承中,公有派生和私有派生对于基类成员在派生类中的可访问性与单继承的规矩是( ) A.完全一致的 B.完全不同的 C.片面一致,片面不同 D.以上都不对 14.在多继承的构造函数定义中,几个基类的构造函数之间的分隔符是( )。
A.: B.; C., D.:: 二.判断以下描述的正确性 1.C++语言中,既允许单继承,又允大量继承 2.派生类是从基类派生出来的,它不能再派生新的派生类 3.派生类的继承方式有两种:公有继承和私有继承 4.在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的 5.在公有继承中,基类中只有公有成员对派生类对象是可见的 6.在私有继承中,基类中只有公有成员对派生类是可见的 第 2 页 共 15 页 7.在私有继承中,基类中全体成员对派生类的对象都是不成见的 8.在养护继承中,对于垂直访问同于公有继承,而对于水平访问同于私有继承 9.派生类是它的基类的组合 10.构造函数可以被继承 11.析构函数不能被继承 12.子类型是不成逆的 13.只有是类M继承了类N,就可以说类M是类N的子类型 14.假设A类型是B类型的子类型,那么A类型必然适应于B类型 15.多继承处境下,基类构造函数的执行依次取决于定义派生类时所指定的各基类的依次 16.单继承处境下,派生类中对基类成员的访问也会展现二义性。
17.解决多继承处境下展现的二义性的方法之一是使用成员名限定法 18.虚基类是用来解决多继承中公共基类在派生类中产生多个基类子对象的拷贝问题 三.回复问题 1.在下面给定的含有虚基类的繁杂继承布局中,回复以下提出的各问题 class A { public: void f(); }; class B:virtual public A { public: void f(); }; class C:public B { }; class D:public C,virtual public A { public: void g(); }; 问题: ⑴ 画出上述布局的DAG图 ⑵ 设有 D d;问:d.f()是否有二义性 ⑶ 设有:void D::g() { f(); }问:g()函数中对f()调用是否有二义性 2.在下面给定的继承布局中,回复以下提出的问题 class A 第 3 页 共 15 页 { public: int a; int b(); int f(); int f(int); int g(); }; class B { public: char f(); int g(); private: int a; int b(); }; class C:public A,public B { }; 设有:C *pc; 问题: ⑴ pc->a=1是否存在二义性。
⑵ ⑶ ⑷ ⑸ pc->b()是否存在二义性 pc->f()是否存在二义性 pc->f(10)是否存在二义性 pc->g()是否存在二义性 四.分析以下程序的输出结果 1.程序清单如下: #include class A { public: A(int i,int j) { a=i; b=j; } void Move(int x,int y) { a+=x; b+=y; } void show() { cout class A { public: A(int i,int j) { a=i; b=j; } void Move(int x,int y) { a+=x; b+=y; } void show() { cout<<\ private: int a,b; }; class B:public A { public: B(int i,int j,int k,int m):A(i,j) { x=k; y=m; } void show() { cout<