第七章答案继承、虚基类.doc_第1页
第七章答案继承、虚基类.doc_第2页
第七章答案继承、虚基类.doc_第3页
第七章答案继承、虚基类.doc_第4页
第七章答案继承、虚基类.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

73 练习题解答 1什么是继承性?为什么说它是面向对象程序中的重要机制? 答:继承是指一个对象是另一个对象的特例,则称这个对象继承了另一个对象。继承是创建新类的一种手段,通过继承生成的新类中包含了被继承类中的所有成员,并且它还具有自己定义的成员。 继承性是面向对象程序设计方法中两大标志之一,即封装性和继承性。继承性将提高可重用性,这是面向对象程序设计的重要特性。继承性又是多态性的重要基础。 2C十十中继承分为哪两类?继承方式又分哪3种? 答:C十十语言支持两种继承:单继承和多继承。有的面向对象程序设计语言只支持单继承,例如Java语言。C十十语言中继承方式分为3种:公有继承(Public)、私有继承(private)和保护继承(protected)。 33种继承方式中各有什么特点?不同继承方式中派生类对基类成员的访问有何不同? 答:继承方式有3种,它们区别在于不同继承方式使得基类成员在派生类中的访问权限不问。具体讲来,公有继承方式时,基类中的公有和保护成员在派生类中仍是公有和保护成员;私有继承方式时,基类中的公有成员和保护成员在派生类中都为私有成员;保护继承方式时,基类中的公有成员和保护成员在派生类中都是保护成员。3种方式中,基B类为A类的子类型,就称它们类型适应。这时,B类对象就是A类对象。可将B类对象直接赋值给A类对象。反之不行。另外,还可用B类对象初始化A类对象的引用,用B类对象的地址值赋给指向A类对象的指针。 9多继承中,在哪些情况下会出现二义性?如何消除二义性? 答:多继承中在下列两种情况下可能出现二义性: (1)访问不同基类中的相同成员可能出现二义性。 (2)访问共同基类中的成员时可能出现二义性。 消除二义性的方法是适当地选择成员名限定的方法,这时要使用作用域运算符:。 10为什么要引入虚基类?带有虚基类的派生类的构造函数有什么特点? 答:引入虚基类的目的是为了解公共基类可能造成的二义性。 带有虚基类的派生类的构造函数的成员初始值表中含有虚基类的构造函数,并对其虚基类的子对象只初始化一次。74 作业题解答一、选择填空1下列对派生类的描述中,( )是错的。 A.一个派生类可以作为另一个派生类的基类 B派生类至少有一个基类 C派生类的成员除了它自己的成员外,还包含了它的基类的成员 D派生类中继承的基类成员的访问权限到派生类保持不变答:D。2派生类的对象对它的基类中( )是可以访问的。 A公有继承的公有成员 B公有继承的私有成员 C公有继承的保护成员 n私有继承的公有成员答:A。3对基类和派生类的关系描述中,( ) )是错的。 A.派生类是基类的具体化 B派生类是基类的子集 C派生类是基类定义的延续 D派生类是基类的组合答:B。4派生类的构造函数的成员初始值表中,不能包含( )。 A基类的构造函数B派生类中子对象的初始化 C基类的子对象初始化 D派生类中一般数据成员的初始化 答:C。 5关于子类型的描述中,( )是错的。 A子类型就是指派生类是基类的子类型 B一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子 类型 C在公有继承下,派生类是基类的子类型 D子类型关系是不可逆的 答:A。 6关于多继承二义性的描述中,( )是错的。 A一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问 可能出现二义性 B解决二义性的最常用的方法是对成员名的限定法 C基类和派生类中同时出现的同名函数,也存在二义性问题 D一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该 基类成员进行访问时,也可能出现二义性 答:C。 7设置虚基类的目的是( )。 A简化程序 B消除二义性 C提高运行效率 D减少目标代码 答:B。 8带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造 函数,这样将对虚基类的子对象初始化( )。 A与虚基类下面的派生类个数有关 B多次 C二次 D一次 答:D。 二、判断下列描述的正确性,对者划,错者划 1C语言中,既允许单继承,又允许多继承。 2派生类是从基类派生出来,它不能再生成新的派生类。 3派生类的继承方式有两种:公有继承和私有继承。 4在公有继承中,基类中的公有成员和私有成员在派生类中都是可见的。. 5在公有继承中,基类中只有公有成员对派生类对象是可见的。 6在私有继承中,基类中只有公有成员对派生类是可见的。 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,virtaul pub1ic A Public:void g();; (1)画出上述结构的DAG图。 (2)设有D d;间:df()是否有二义性?(3)设有Void D:g() f(); 问:g()函数中对f()调用是否有二义性? 解答: (1)上述结构的DAG图如下所示。 Afg() B fg() C D (2)无二义性。 (3)无二义性。 2根据下面给定的继承结构,回答问题。 class Apublic: int a; int b(); int f(); int f(int);int g(); class Bpublic: char f();int g(); private: int a:int b();; class C:Public A,Public B ;设有: C *pc(1)pc一a1;是否有二义性?(2)pc一b(),是否有二义性?(3)pc一f();是否有二义性?(4)pc一f(10);是否有二义性?(5)pc一g();是否有二义性?提示:二义性检查是在访问控制权限或类型检查之前进行的。解答:(1)无。(2)无。(3)有。(4)无。(5)有。四、分析下列程序的输出结果1#includeiostreamhclass A public: A(int i,int j)ai;bj; void Move(int x,int y)a十x;b十y; void Show()cout”(”a”、”b”endl; private: int a,b; ;class B:private A public: B(int i,int j,int k,int l) :A(i,j)xk;y1;void Show() coutx”,”yendl; void fun() Move(3,5); void f l()A:Show(); private:int x,y;;void main() A e(1,2);eShow();B d(3,4,5,6);dfun();dShow();df l();运行该程序的输出结果如下所示。(1,2)5,6(6,9)void main() A e(1,2);eShow();void main() V v: vInitR(10,20,30,40); vfun(); cout”(”vGetx()”,”v。GetY()”,”vGetW()”,”vGetH()”endl;运行该程序的输出结果如下所示。(13,22,30,40)分析:该程序中有3个类:L,R和V。其中,R类公有继承L类V类又公有继承R类。因此V类的对象可以调用I类和R类中的非私有成员。 4 #includeiostream。h class P public: P(int P1,int P2)pril=P1;Pri2p2; int inc1()return +pril; int inc2()return +pri2; void display()coutpri1=pril,pri2endl; private: int pri1,pri2;class D1:private P public: D1(int p1, int p2,int p3):p(p1,p2) pri3=p3;int inc1()return p : inc1();int inc3()return +pri3;void display();p:display();coutpri3=pri3endl; private int pri3;;class D2:Public P public: D2(int P1,int p2,int p4):P(P1,p2) Pri4:p4; int incl() P:incl(); P:inc2(); return P:inc1(); int inc4()return+pri4 void display() P:display(); cout“Pri4”Pri4endl; prlvate: int pri4;;class D12:prive D1,public D2 public: d12(int p11, int p12, int p13,int p21,int p22,int p23,int p) :D1(p11,p12,p13),D2(p21,p22,p23) pril2=p; int inc1() D2:inc1();return D2:inc1(); int inc5()return +pril2; void display()countd2:display()n;D2:display();coutpril2=pril2endl; Prlvate:int pr512;void main() D12d(1,2,3,4,5,6,7); ddisplay(); coutcndl; dincl(); dinc4(); dinc5(); dD12:incl();ddisplay(); 运行该程序输出结果如下所示。 D2:disPlay() pril4,pri25 Dri4:6 pril2:7 D2:display() pril12,pri29 Dri4;7 Dril2:8 分析: 该程序中共有4个类:P类、D1类、D2类和D12类。其中,P类是Dl共基类,D12类是Dl类和1)2类的派生类,这是一种多继承的例子。Dl 2D12类的两个基类中,D1是私有继承,D2是公有继承。5#include class P public: P(int P1,int P2) P ril=P1;P ri2P2; int incl()return +pri1;int inc2() return +pri2;void display()cout”pri1=”pri1”,pri2=”pri2endl; private:int pri1,pri2;class D1:virtual private Ppublic: D1(int p1,int p2,int p3):P(p1,p2) pri3P3; int incl() return P:inc1(); int inc3() (return +pri3;)void display() P:display();cout”Pri3”pri3endl;private:int pr53;class D2:virtual public P public:D2(int P1,int p2,int p4):P(p1,p2)pri4:P4; int incl()P:incl();P:inc1() P:inc2();return P:inc1(); int inc4() ( return +pri4; )void disPlay() P:display();cout”pri4;”pri4cndl; private: int pri4;class D12:private D1,public D2public:D12(int p11,int p12,int p13,int p21,int p22,int p23,int p) :D1(p11,P12,P13),D2(p21,p22,p23),P(p11,p21) pril2:P;int incl() D2:incl();return D2:incl(); int inc5() (return十十pril2; )void display() cout”D2:disPlay()n”; D2:display();cout”pril2”pril2endl; private:int pfil2;void main() D12 d(1,2,3,4,5,6,7); ddisplay();

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论