您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 习题7及其解答(第二版)
第7章继承习题77.1选择题1.在c++中,类之间的继承关系具有(c)。(a)自反性(b)对称性(c)传递性(d)反对称性2.下列关于类的继承描述中,(d)是正确的。(a)派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数(b)派生类也是基类,所以它们是等价的(c)派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员(d)一个基类可以有多个派生类,一个派生类可以有多个基类3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的(a)。(a)public成员(b)private成员(c)protected成员(d)友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的(b)。(a)public成员(b)private成员(c)protected成员(d)友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的(c)。(a)public成员(b)private成员(c)protected成员(d)友员6.不论派生类以何种方式继承基类,都不能直接使用基类的(b)。(a)public成员(b)private成员(c)protected成员(d)public成员和protected成员7.下面描述中,错误的是(d)。(a)在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问(b)在基类定义的protected成员在私有继承的派生类中可见(c)在基类定义的静态成员在私有继承的派生类中可见(d)访问声明可以在公有继承派生类中把基类的public成员声明为private成员8.在c++中,可以被派生类继承的函数是(a)。(a)成员函数(b)构造函数(c)析构函数(d)友员函数9.在创建派生类对象时,构造函数的执行顺序是(d)。(a)对象成员构造函数、基类构造函数、派生类本身的构造函数(b)派生类本身的构造函数、基类构造函数、对象成员构造函数(c)基类构造函数、派生类本身的构造函数、对象成员构造函数(d)基类构造函数、对象成员构造函数、派生类本身的构造函数10.当不同的类具有相同的间接基类时,有特点(c)。(a)各派生类对无法按继承路线产生自己的基类版本(b)为了建立惟一的间接基类版本,应该声明间接基类为虚类(c)为了建立惟一的间接基类版本,应该声明派生类虚继承基类(d)一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类7.2阅读下列程序,写出执行结果1.#includeiostream.hclassBase{public:voidget(inti,intj,intk,intl){a=i;b=j;x=k;y=l;}voidprint(){couta=a'\t'b=b'\t'x=x'\t'y=yendl;}inta,b;protected:intx,y;};classA:publicBase{public:voidget(inti,intj,intk,intl){Baseobj3;obj3.get(50,60,70,80);obj3.print();a=i;b=j;x=k;y=l;u=a+b+obj3.a;v=y-x+obj3.b;}voidprint(){couta=a'\t'b=b'\t'x=x'\t'y=yendl;coutu=u'\t'v=vendl;}private:intu,v;};voidmain(){Baseobj1;Aobj2;obj1.get(10,20,30,40);obj2.get(30,40,50,60);obj1.print();obj2.print();}【答案】a=50b=60x=70y=80a=10b=20x=30y=40a=30b=40x=50y=60u=120v=702.#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;};voidmain(){Aobj(1,2,3,4);}【答案】调用基类BASE1的构造函数:3调用基类BASE2的构造函数:2调用基类BASE1的构造函数:4调用基类BASE2构造函数:1调用派生类A的构造函数:103.#includeiostream.hclassA{public:A(inti,intj){a=i;b=j;}voidAdd(intx,inty){a+=x;b+=y;}voidshow(){cout(a)\t(b)\n;}private:inta,b;};classB:publicA{public:B(inti,intj,intm,intn):A(i,j),x(m),y(n){}voidshow(){cout(x)\t(y)\n;}voidfun(){Add(3,5);}voidff(){A::show();}private:intx,y;};voidmain(){Aa(1,2);a.show();Bb(3,4,5,6);b.fun();b.A::show();b.show();b.ff();}【答案】(1)(2)(6)(9)(5)(6)(6)(9)4.#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;}};voidmain(){D*ptr=newD(classA,classB,classC,classD);deleteptr;}【答案】classAclassBclassCclassD7.3思考题1.函数和类两种程序模块都可以实现软件重用,它们之间有什么区别?2.请按照类成员的访问特性、类层次的继承特点,做出一张表格,总结各种类成员在基类、派生类中的可见性和作用域。3.若有以下说明语句:classA{private:inta1;public:inta2;doublex;/*…*/};classB:privateA{private:intb1;publicintb2;doublex;/*…*/};Bb;对象b将会生成什么数据成员?与继承关系、访问特性、名字有关吗?4.若有以下说明语句:classA{/*…*/public:voidsameFun();};classB:publicA{/*…*/public:voidsameFun();};voidcomFun(){Aa;Bb;/*…*/}(1)若在B::sameFun中要调用A::sameFun,语句形式如何?它将在什么对象上操作?(2)在comFun中可以用什么方式调用A::sameFun和B::sameFun?语句形式如何?它们将可以在什么对象上操作?5.“虚基类”是通过什么方式定义的?如果类A有派生类B,C,D,类A是类B和类C的虚基类,那它也一定是类D的虚基类吗?为什么?6.在具有虚继承的类体系中,建立派生类对象时以什么顺序调用构造函数?请用简单程序说明,并上机验证你的分析。7.4编程题1.定义一个Rectangle类,它包含两个数据成员length和width;以及包含用于求长方形面积的成员函数。再定义Rectangle的派生类Rectangular,它包含一个新数据成员height和用来求长方体体积的成员函数。在main函数中,使用两个类,求某个长方形的面积和某个长方体的体积。【解答】#includeiostream.hclassrectangle{public:rectangle(floatl,floatw){length=l;width=w;}floatarea(){return(length*width);}floatgetlength(){returnlength;}floatgetwidth(){returnwidth;}private:floatlength;floatwidth;};classrectangular:publicrectangle{public:rectangular(floatl,floatw,floath):rectangle(l,w){height=h;}floatgetheight(){returnheight;}floatvolume(){returnarea()*height;}private:floatheight;};voidmain(){rectangleobj1(2,8);rectangularobj2(3,4,5);coutlength=obj1.getlength()'\t'width=obj1.getwidth()endl;coutrectanglearea=obj1.area()endl;coutlength=obj2.getlength()'\t'width=obj2.getwidth();cout'\t'height=obj2.getheight()endl;coutrectangularvolume=obj2.volume()endl;}2.假设某销售公司有销售经理和销售员工,月工资的计算办法是:销售经理的固定月薪为8000元并提取销售额的5/1000作为工资;销售员工只提取销售额的5/1000作为工资。编一程序,定义一个基类Employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。由Employee类派生Salesman类,再由Salesman类派生Salesmanager类。Salesman类包含两个新数据成员commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay()和用于输出的成员函数print()。Salesmanager类包含新数据成员monthlypay,及用于输入销售额并计算销售经理工资的成员函数pay()、用于输出的成员函数print()。在main函数中,测试你的类结构,求若干个不同员工的工资。【解答】#includeiostream.h#includestring.hclassemployee{public:employee(){cout编号:;cinnumber;cout姓名:;cinname;salary=0;}protected:charnumber[5];charname[10];doublesalary;};classsalesman:publicemployee{public:salesman(){commrate=0.005;}voidp
本文标题:习题7及其解答(第二版)
链接地址:https://www.777doc.com/doc-4880662 .html