派生与继承习题答案_第1页
派生与继承习题答案_第2页
派生与继承习题答案_第3页
派生与继承习题答案_第4页
派生与继承习题答案_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

第七章派生与继承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.分析以下程序运行结果。#include<iostream.h>classA{private:inta;public:A(inti=0){a=i;}voidshow(){cout<<"a="<<a<<endl;}};classB{private:intb;public:B(inti=0){b=i;}voidshow(){cout<<"b="<<b<<endl;}};classC:publicA,publicB{private:intc;public:C(inti=0,intj=0,intk=0):A(i),B(j){c=k;}voidshow(){A::show();B::show();cout<<"c="<<c<<endl;}};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.分析以下程序运行结果。#include<iostream.h>classBase1{public:Base1(inti){cout<<"调用基类Base1结构函数:"<<i<<endl;}};classBase2{public:Base2(intj){cout<<"调用基类Base2结构函数:"<<j<<endl;}};classA:publicBase1,publicBase2{public:A(inta,intb,intc,intd):Base2(b),Base1(c),b2(a),b1(d){cout<<"调用派生类A结构函数:"<<a+b+c+d<<endl;}private:Base1b1;Base2b2;};intmain(){Aobj(1,2,3,4);}答:调用基类BASE1结构函数:3调用基类BASE2结构函数:2调用基类BASE1结构函数:4调用基类BASE2结构函数:1调用派生类A结构函数:109.分析以下程序运行结果。#include<iostream.h>classA{public:A(constchar*s){cout<<s<<endl;}~A(){}};classB:virtualpublicA{public:B(constchar*s1,constchar*s2):A(s1){cout<<s2<<endl;}};classC:virtualpublicA{public:C(constchar*s1,constchar*s2):A(s1){cout<<s2<<endl;}};classD:publicB,publicC{public:D(constchar*s1,constchar*s2,constchar*s3,constchar*s4):B(s1,s2),C(s1,s3),A(s1){cout<<s4<<endl;}};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类作为正方形起始点,并求正方形周长和面积。答:#include<iostream.h>classlocation{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<<","<<y<<endl;cout<<"正方形周长为:"<<girth<<endl;cout<<"正方形面积为:"<<area<<endl;}voidmain(){squarem(10,10,5);m.set();m.show();}12.把定义平面直角坐标系上一个点类Point作为基类,派生出描述一条直线类Line,再派生出一个矩形类Rect。要求组员函数能求出两点间距离,矩形周长和面积等。设计一个测试程序,并结构完整程序。答:#include<iostream>#include<cmath>usingnamespacestd;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.假设某销售企业有销售经理和销售员工,月工资计算方法是:销售经理固定月薪为8000元并提取销售额5/1000作为工资;销售员工只提取销售额5/1000作为工资。编一程序,定义一个基类Employee,它包含三个数据组员number、name和salary,以及用于输入编号和姓名结构函数。由Employee类派生Salesman类,再由Salesman类派生Salesmanager类。Salesman类包含两个新数据组员commrate和sales,还包含用于输入销售额并计算销售员工工资组员函数pay和用于输出组员函数print。Salesmanager类包含新数据组员monthlypay,以及用于输入销售额并计算销售经理工资组员函数pay、用于输出组员函数print()。在main函数中,测试你类结构,求若干个不一样员工工资。答:#include<iostream>usingnamespacestd;classemployee{public:employee(){cout<<"编号:";cin>>number;cout<<"姓名:";cin>>name;salary=0;}protected:charnumber[5];charname[10];doublesalary;};classsalesman:publicemployee{public:salesman(){commrate=0.005;}voidpay(){cout<<name<<"本月销售额:";cin>>sales;salary=sales*commrate;}voidprint(){cout<<"销售员:"<<name<<"编号:"<<number<<"本月工资:"<<salary<<endl; }protected:doublecommrate;doublesales;};classsalesmanager:publicsalesman{public:salesmanager(){monthlypay=8000;commrate=0.005;}voidpay(){cout<<name<<"本月部门销售额:";cin>>sales;salary=monthlypay+sales*commrate;}voidprint(){cout<<"销售经理:"<<name<<"编号:"<<number<<"本月工资:"<<salary<<endl; }private:doublemonthlypay;};intmain(){salesmanobj1;obj1.pay();obj1.print();salesmanagerobj2;obj2.pay();obj2.print();}14.编写一个程序实现那一个班级学生学期成绩管理。个人信息类Person数据组员有:姓名,年纪,性别;课程类Course数据组员有:课程名,学分,成绩;学生类Student从Person类派生,并增加数据组员:学号,Course对象数据组员数组(大小为8),总成绩,总学分和平均成绩;班级类Class类数据组员有:Student类对象组员数组(大小由结构函数确定),班号,班级人数等。要求:(1)本班级Class类对象组员数组需要在结构函数中用new动态分配内存空间,在析构函数中释放。在类Class中添加组员函数Seek,经过学号查找并输出该学生全部信息。(2)结构三个学生数据,每个学生都有三门课程成绩,输入并显示这些数据。(3)依照类需要添加适当其余组员,编写完整程序并测试。答:#include<iostream.h>#include<cstring.h>classPerson{public:Person(char*name,intage,charsex='M'){strncpy(this->name,name,20);this->age=age;this->sex=sex; }voidshow(){ cout<<"学生名字是:"<<name<<endl;cout<<"学生年纪是:"<<age<<endl;cout<<"学生性别是:"<<sex<<endl;}private:charname[20];intage;charsex; };classCourse{public:Course(){cout<<"请输入课程名,学分和分数"<<endl;cin>>coursename>>credit>>score; }public:charcoursename[20];floatscore;floatcredit;};classStudent:Person{public:Student(char*name="NULL",intage=0,charsex='M',char*no="0"):Person(name,age,sex),Course(){strncpy(this->no,no,20);}doubleMscoresum(){scoresum=0;for(inti=0;i<2;i

温馨提示

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

评论

0/150

提交评论