第7章习题答案

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第七章派生与继承1.单选题(1).下列关于继承的描述中,错误的是(B)。A.继承是重用性的重要机制B.C++语言支持单重继承和双重继承C.继承关系不是可逆的D.继承是面向对象程序设计语言的重要特性(2).下列关于基类和派生类的描述中,错误的是(C)。A.一个基类可以生成多个派生类B.基类中所有成员都是它的派生类的成员C.基类中成员访问权限继承到派生类中不变D.派生类中除了继承的基类成员还有自己的成员(3).下列关于派生类的描述中,错误的是(D)。A.派生类至少有一个基类B.一个派生类可以作另一个派生类的基类C.派生类的构造函数中应包含直接基类的构造函数D.派生类默认的继承方式是public(4).派生类的对象可以直接访问的基类成员是(A)。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.基类和派生类中同时出现同名成员时,会产生二义性2.多重继承与单一继承的区别是什么?答:派生类只有一个基类的称为单一继承。单一继承的定义格式为:class派生类名:继承方式基类名{派生类中新成员定义}派生类有两个或两个以上的基类称为多重继承。多重继承的定义格式为:class派生类名:继承方式1基类名1,继承方式2基类名2,……继承方式n基类名n{派生类中新成员定义}3.继承有哪三种继承方式,各自有何特点?答:继承方式主要表示派生类继承基类时采用的继承方式,主要有三种,即公有继承、私有继承和保护继承。(1)公有继承(public)。公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。(2)私有继承(private)私有继承的特点是基类的公有成员和保护成员作为派生类的私有成员,并且不能被这个派生类的子类访问。(3)保护继承(protected)保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。4.在定义派生类的过程中,如何对基类的数据成员进行初始化?答:由于基类在派生类中通常是隐藏的,所以依序通过调用基类的构造函数来设定基类的数据成员的初值。它的格式为派生类名(形参表):基类1(参数表),基类2(参数表)…对象成员1(参数表),对象成员2(参数表)…{}5.什么是赋值兼容规则?赋值兼容规则的实质是什么?试举例说明。答:赋值兼容规则是指,对于共有派生类来说,可以将派生类的对象赋值给其基类。它实质上就是基类对象的内存空间和派生类对象中基类拷贝的内存空间引用的兼容。6.什么是虚基类?它的作用是什么?答:虚基类不是指基类是虚的,而是指在派生类中指定的基类是虚继承的方式。使用虚基类的目的是在多重派生中使用共有基类在派生类中只有一个拷贝从而解决有多个基类拷贝所产生的二义性问题。7.分析下列程序的运行结果。#includeiostream.hclassA{private:inta;public:A(inti=0){a=i;}voidshow(){couta=aendl;}};classB{private:intb;public:B(inti=0){b=i;}voidshow(){coutb=bendl;}};classC:publicA,publicB{private:intc;public:C(inti=0,intj=0,intk=0):A(i),B(j){c=k;}voidshow(){A::show();B::show();coutc=cendl;}};voidmain(){Bb(12);b.show();Cc1,c2(30,40),c3(70,80,90);c1.show();c2.show();c3.show();c2.B::show();}答:程序运行结果:b=12a=0b=0c=0a=30b=40c=0a=70b=80c=90b=40分析:(1)本程序是多重继承的程序,类C继承了类A和类B的数据成员。(2)在主程序中,分别对类C的对象c1、c2、c3赋不同的值,则对类A和类B数据成员的赋值也不一样。8.分析下列程序的运行结果。#includeiostream.hclassBase1{public:Base1(inti){cout调用基类Base1的构造函数:iendl;}};classBase2{public:Base2(intj){cout调用基类Base2的构造函数:jendl;}};classA:publicBase1,publicBase2{public:A(inta,intb,intc,intd):Base2(b),Base1(c),b2(a),b1(d){cout调用派生类A的构造函数:a+b+c+dendl;}private:Base1b1;Base2b2;};intmain(){Aobj(1,2,3,4);}答:调用基类BASE1的构造函数:3调用基类BASE2的构造函数:2调用基类BASE1的构造函数:4调用基类BASE2构造函数:1调用派生类A的构造函数:109.分析下列程序的运行结果。#includeiostream.hclassA{public:A(constchar*s){coutsendl;}~A(){}};classB:virtualpublicA{public:B(constchar*s1,constchar*s2):A(s1){couts2endl;}};classC:virtualpublicA{public:C(constchar*s1,constchar*s2):A(s1){couts2endl;}};classD:publicB,publicC{public:D(constchar*s1,constchar*s2,constchar*s3,constchar*s4):B(s1,s2),C(s1,s3),A(s1){couts4endl;}};intmain(){D*ptr=newD(classA,classB,classC,classD);deleteptr;}答:classAclassBclassCclassD10.有人定义一个教师类派生一个学生类。他认为“姓名”和“性别”是教师、学生共有的属性,声明为public,“职称”和“工资”是教师特有的,声明为private。在学生类中定义特有的属性“班级”和“成绩”。所以有classteacher{public:charname[20];charsex;//……Private:chartitle[20];doublesalary;};classstudent:publicteacher{//……private:chargrade[20];intscore;};你认为这样定义合适吗?请做出你认为合理的类结构定义。答:不合适,这样导致数据冗余。合理的结构是提取它们共有的数据和操作定义一个基类,然后分别定义teacher和student作为派生类。classperson{protected:charname[20];charsex;//……};classteacher:publicteache{//……private:chartitle[20];doublesalary;};classstudent:publicteacher{//……private:chargrade[20];intscore;};11.定义一个描述坐标位置的类location,从location派生出正方形类square,在正方形类中将location类作为正方形的起始点,并求正方形的周长和面积。答:#includeiostream.hclasslocation{protected:intx,y;public:location(inta=0,intb=0){x=a;y=b;}};classsquare:publiclocation{private:intlen;intgirth;intarea;public:square(intx,inty,intt):location(x,y){len=t;}voidset();voidshow();};voidsquare::set(){girth=4*len;area=len*len;}voidsquare::show(){cout正方形的坐标点为:x,yendl;cout正方形的周长为:girthendl;cout正方形的面积为:areaendl;}voidmain(){squarem(10,10,5);m.set();m.show();}12.把定义平面直角坐标系上的一个点的类Point作为基类,派生出描述一条直线的类Line,再派生出一个矩形类Rect。要求成员函数能求出两点间的距离,矩形的周长和面积等。设计一个测试程序,并构造完整的程序。答:#includeiostream#includecmathusingnamespacestd;classPoint{public:Point(intx=0,inty=0){this-x=x;this-y=y;}public:intx,y;};classLine:publicPoint{public:Line(intx1=0,inty1=0,intx2=0,inty2=0):a(x1,y1),b(x2,y2){}doubleLength(){ints=a.x-b.x;intt=a.y-b.y;returnsqrt(s*s+t*t);}private:Pointa,b;};classRect:publicLine{public:Rect(intx1,inty1,intx2,inty2):l1(x1,y1,x1,y2),l2(x1,y1,x2,y1)//x1,y1是矩形左下角的坐标,x2,y2是矩形右上角的坐标{}doubleSumLength(){//cout矩形的周长是endl;return(l1.Length()+l2.Length())*2;}doublesquare(){//cout矩形的周长是endl;returnl1.Length()*l2.Length();}private:Linel1,l2;};voidmain(){Lineline(0,0,10,0);cout这条线段的长度为:line.Length();Rectrect(0,0,10,10);cout矩形的周长是rect.SumLength()endl;cout矩形的周长是rect.square()endl;}13.假

1 / 14
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功