ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:20.27KB ,
资源ID:11146510      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/11146510.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第章习题答案.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第章习题答案.docx

1、第章习题答案第七章 派生与继承1.单选题(1)下列关于继承的描述中,错误的是( B )。A继承是重用性的重要机制BC+语言支持单重继承和双重继承C继承关系不是可逆的D继承是面向对象程序设计语言的重要特性(2)下列关于基类和派生类的描述中,错误的是( C )。A一个基类可以生成多个派生类B基类中所有成员都是它的派生类的成员C基类中成员访问权限继承到派生类中不变D派生类中除了继承的基类成员还有自己的成员(3)下列关于派生类的描述中,错误的是( D )。A派生类至少有一个基类B一个派生类可以作另一个派生类的基类C派生类的构造函数中应包含直接基类的构造函数D派生类默认的继承方式是public(4)派生

2、类的对象可以直接访问的基类成员是( 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)下列关于

3、子类型的描述中,错误的是( B )。A在公有继承下,派生类是基类的子类型B如果类A是类B的子类型,则类B也是类A的子类型C如果类A是类B的子类型,则类A的对象就是类B的对象D在公有继承下,派生类对象可以初始化基类的对象引用(8)下列关于多继承二义性的描述中,错误的是( D )。A一个派生类的多个基类中出现了同名成员时,派生类对同名成员的访问可能出现二义性B一个派生类有多个基类,而这些基类又有一个共同的基类,派生类访问公共基类成员时,可能出现二义性C解决二义性的方法是采用类名限定D基类和派生类中同时出现同名成员时,会产生二义性2多重继承与单一继承的区别是什么?答:派生类只有一个基类的称为单一继承

4、。单一继承的定义格式为:class: 派生类中新成员定义派生类有两个或两个以上的基类称为多重继承。多重继承的定义格式为:class:, 派生类中新成员定义3继承有哪三种继承方式,各自有何特点?答:继承方式主要表示派生类继承基类时采用的继承方式,主要有三种,即公有继承、私有继承和保护继承。(1)公有继承(public)。 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状态,而基类的私有成员仍然是私有的。(2)私有继承(private) 私有继承的特点是基类的公有成员和保护成员作为派生类的私有成员,并且不能被这个派生类的子类访问。(3)保护继承(protected)

5、保护继承的特点是基类的所有公有成员和保护成员都成为派生类的保护成员,并且只能被它的派生类成员函数或友元访问,基类的私有成员仍然是私有的。4.在定义派生类的过程中,如何对基类的数据成员进行初始化?答: 由于基类在派生类中通常是隐藏的,所以依序通过调用基类的构造函数来设定基类的数据成员的初值。它的格式为(形参表):基类1(参数表),基类2(参数表)对象成员1(参数表),对象成员2(参数表)5.什么是赋值兼容规则?赋值兼容规则的实质是什么?试举例说明。答:赋值兼容规则是指,对于共有派生类来说,可以将派生类的对象赋值给其基类。它实质上就是基类对象的内存空间和派生类对象中基类拷贝的内存空间引用的兼容。6

6、.什么是虚基类?它的作用是什么?答:虚基类不是指基类是虚的,而是指在派生类中指定的基类是虚继承的方式。使用虚基类的目的是在多重派生中使用共有基类在派生类中只有一个拷贝从而解决有多个基类拷贝所产生的二义性问题。7. 分析下列程序的运行结果。#includeclass A private: int a; public: A(int i=0) a=i; void show()couta=aendl;class B private: int b; public: B(int i=0)b=i; void show() coutb=bendl;class C:public A,public Bprivat

7、e: int c; public: C(int i=0,int j=0,int k=0):A(i),B(j) c=k; void show() A:show(); B:show(); coutc=cendl; ;void main() B b(12); b.show(); C c1,c2(30,40),c3(70,80,90); c1.show(); c2.show(); c3.show(); c2.B:show();答:程序运行结果: b=12 a=0 b=0 c=0 a=30 b=40 c=0 a=70 b=80 c=90 b=40分析:(1)本程序是多重继承的程序,类C继承了类A和类B的

8、数据成员。(2)在主程序中,分别对类C的对象c1、c2、c3赋不同的值,则对类A和类B数据成员的赋值也不一样。8. 分析下列程序的运行结果。#includeclass Base1 public : Base1( int i ) cout 调用基类Base1的构造函数: i endl ; ;class Base2 public: Base2( int j ) cout 调用基类Base2的构造函数: j endl ; ; class A : public Base1, public Base2 public : A( int a, int b, int c, int d ) : Base2(b)

9、, Base1(c), b2(a), b1(d) cout 调用派生类A的构造函数: a+b+c+d endl; private : Base1 b1 ; Base2 b2 ; ; int main() A obj( 1, 2, 3, 4 ); 答:调用基类BASE1的构造函数:3调用基类BASE2的构造函数:2调用基类BASE1的构造函数:4调用基类BASE2构造函数:1调用派生类A的构造函数:109. 分析下列程序的运行结果。#includeclass A public : A(const char *s) cout s endl ; A();class B : virtual publi

10、c A public : B(const char *s1, const char *s2) : A( s1 ) cout s2 endl ; ;class C : virtual public A public : C(const char *s1, const char *s2):A(s1) cout s2 endl ; ;class D : public B, public C public : D( const char *s1, const char *s2, const char *s3, const char *s4 ) : B( s1, s2 ), C( s1, s3 ), A

11、( s1 ) cout s4 endl ; ;int main() D *ptr = new D( class A, class B, class C, class D ) ; delete ptr;答:class Aclass Bclass Cclass D10. 有人定义一个教师类派生一个学生类。他认为“姓名”和“性别”是教师、学生共有的属性,声明为public,“职称”和“工资”是教师特有的,声明为private。在学生类中定义特有的属性“班级”和“成绩”。所以有 class teacher public : char name20; char sex; / Private : char

12、 title20; double salary; class student : public teacher /private : char grade20 ; int score;你认为这样定义合适吗?请做出你认为合理的类结构定义。答:不合适,这样导致数据冗余。合理的结构是提取它们共有的数据和操作定义一个基类,然后分别定义teacher和student作为派生类。class person protected:char name20; char sex; / ;class teacher : public teache / private: char title20; double sala

13、ry; class student : public teacher /private : char grade20 ; int score;11. 定义一个描述坐标位置的类location,从location派生出正方形类square,在正方形类中将location类作为正方形的起始点,并求正方形的周长和面积。答:#includeclass location protected: int x,y; public: location(int a=0,int b=0) x=a;y=b;class square:public location private:int len;int girth;i

14、nt area; public: square(int x,int y,int t):location(x,y) len=t; void set(); void show();void square :set() girth=4*len; area=len*len;void square :show() cout正方形的坐标点为:x,yendl; cout正方形的周长为:girthendl; cout正方形的面积为:areaendl;void main() square m(10,10,5); m.set(); m.show(); 12. 把定义平面直角坐标系上的一个点的类Point作为基类,

15、派生出描述一条直线的类Line,再派生出一个矩形类Rect。要求成员函数能求出两点间的距离,矩形的周长和面积等。设计一个测试程序,并构造完整的程序。答:#include#includeusing namespace std;class Pointpublic: Point(int x=0,int y=0) this-x=x; this-y=y; public : int x,y; ;class Line:public Pointpublic: Line(int x1=0,int y1=0,int x2=0,int y2=0) :a(x1,y1),b(x2,y2) double Length()

16、 int s= a.x-b.x; int t= a.y-b.y; return sqrt(s*s+t*t); private: Point a,b;class Rect:public Linepublic: Rect(int x1,int y1,int x2,int y2 ):l1(x1,y1,x1,y2),l2(x1,y1,x2,y1)/x1,y1是矩形左下角的坐标,x2,y2是矩形右上角的坐标 double SumLength () /cout矩形的周长是endl; return (l1.Length()+l2.Length()*2; double square () /cout矩形的周长

17、是endl; return l1.Length()*l2.Length(); private: Line l1,l2;void main() Line line(0,0,10,0); cout这条线段的长度为:line.Length (); Rect rect(0,0,10,10); cout矩形的周长是rect.SumLength()endl; cout矩形的周长是rect.square ()endl; 13. 假设某销售公司有销售经理和销售员工,月工资的计算办法是:销售经理的固定月薪为8000元并提取销售额的5/1000作为工资;销售员工只提取销售额的5/1000作为工资。编一程序,定义一

18、个基类Employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。由Employee类派生Salesman类,再由Salesman类派生Salesmanager类。Salesman类包含两个新数据成员 commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay和用于输出的成员函数print。Salesmanager类包含新数据成员 monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay、用于输出的成员函数print()。在main函数中,测试你的类结构,求若干个不同员工的工资。答:#include u

19、sing namespace std;class employee public: employee() cout number; cout name; salary = 0;protected: char number5; char name10; double salary; ;class salesman: public employee public: salesman() commrate = 0.005; void pay() coutname sales; salary = sales*commrate;void print() cout销售员 :name编号:number本月工

20、资:salaryendl; protected:double commrate;double sales; ;class salesmanager: public salesman public: salesmanager() monthlypay = 8000; commrate = 0.005; void pay() coutname sales; salary = monthlypay + sales*commrate; void print() cout销售经理 :name编号:number本月工资:salaryendl; private: double monthlypay;int

21、main() salesman obj1; obj1.pay(); obj1.print(); salesmanager obj2; obj2.pay(); obj2.print();14. 编写一个程序实现那一个班级学生的学期成绩管理。个人信息类Person的数据成员有:姓名,年龄,性别;课程类Course的数据成员有:课程名,学分,成绩;学生类Student从Person类派生,并增加数据成员:学号,Course对象数据成员数组(大小为8),总成绩,总学分和平均成绩;班级类Class类的数据成员有:Student类对象成员数组(大小由构造函数确定),班号,班级人数等。要求:(1)本班级Cl

22、ass类的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中释放。在类Class中添加成员函数Seek,通过学号查找并输出该学生的全部信息。(2)构造三个学生的数据,每个学生都有三门课程的成绩,输入并显示这些数据。(3)根据类的需要添加适当的其他成员,编写完整的程序并测试。答:#include#includeclass Personpublic: Person(char *name ,int age,char sex=M) strncpy(this-name,name ,20); this-age=age ; this-sex=sex; void show() cout学生的名

23、字是:nameendl; cout学生的年龄是:ageendl; cout学生的性别是:sexendl; private : char name20; int age; char sex; ;class Coursepublic: Course() cout请输入课程名,学分和分数coursenamecreditscore; public: char coursename20; float score; float credit; ;class Student:Personpublic: Student(char *name=NULL,int age=0,char sex=M,char *no

24、=0):Person(name,age,sex),Course() strncpy(this-no,no,20); double Mscoresum() scoresum=0; for(int i=0;i2;i+) scoresum+=Couri.score; return scoresum; double Mcreditsum() creditsum=0; for(int i=0;i2;i+) creditsum+=Couri.credit; return creditsum; void Show() Person:show(); cout学号为:noendl; cout总的学分为:Mcre

25、ditsum()endl; cout总的成绩为:Mscoresum()n=n; strncpy(this-classno,classno,20); stu=(Student *)new Student n ; Class() if(stu) deletestu; stu=NULL; void Seek(char *no) for(int i=0;in;i+) if(no=stui.no) stui.Show(); break; if(i=8) cout找不到该学生endl; void Show() cout班级的学号为classno共有n个学生,他们分别是:; for(int i=0;in;i+) stu0.Show(); ;void main()Class cla(5,1);cla.Show();/Student stu(Wang,16,F,4);/stu.Show ();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1