第7章习题答案_第1页
第7章习题答案_第2页
第7章习题答案_第3页
第7章习题答案_第4页
第7章习题答案_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

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 Aprivate: 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 Bprivate: int c; public:

7、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=12a=0b=0c=0a=30b=40c=0a=70b=80c=90b=40分析:(1)本程序是多重继承的程序,类C继承了类A和类B的数据成员。(2)在主程序中,分别对类C的对象c1、c2、c3赋

8、不同的值,则对类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), Base1(c), b2(a), b1(d) cout 调

9、用派生类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 public A public : B(const char *s1,

10、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( s1 ) cout s4 endl ; ;int main

11、() 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 title20; double salary; class stud

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

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

14、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作为基类,派生出描述一条直线的类Line,再派生出一个矩形类Rect。要求成员函数能求出两

15、点间的距离,矩形的周长和面积等。设计一个测试程序,并构造完整的程序。答:#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()int s= a.x-b.x;int t= a.y-b.y;return sqrt(s*s+t*t)

16、;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矩形的周长是endl;return l1.Length()*l2.Length();private:Line l1,l2;void

17、 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作为工资。编一程序,定义一个基类Employee,它包含三个数据成员number、name和salary,以及用于输入编号和姓名的构造函数。由Employee类派

18、生Salesman类,再由Salesman类派生Salesmanager类。Salesman类包含两个新数据成员 commrate和sales,还包含用于输入销售额并计算销售员工工资的成员函数pay和用于输出的成员函数print。Salesmanager类包含新数据成员 monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay、用于输出的成员函数print()。在main函数中,测试你的类结构,求若干个不同员工的工资。答:#include using namespace std;class employee public: employee() cout number; co

19、ut 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本月工资:salaryendl; protected:double commrate;double sales; ;class salesman

20、ager: 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 main() salesman obj1; obj1.pay(); obj1.print(); salesmanager obj2; ob

21、j2.pay(); obj2.print();14. 编写一个程序实现那一个班级学生的学期成绩管理。个人信息类Person的数据成员有:姓名,年龄,性别;课程类Course的数据成员有:课程名,学分,成绩;学生类Student从Person类派生,并增加数据成员:学号,Course对象数据成员数组(大小为8),总成绩,总学分和平均成绩;班级类Class类的数据成员有:Student类对象成员数组(大小由构造函数确定),班号,班级人数等。要求:(1)本班级Class类的对象成员数组需要在构造函数中用new动态分配内存空间,在析构函数中释放。在类Class中添加成员函数Seek,通过学号查找并输出

22、该学生的全部信息。(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学生的名字是:nameendl;cout学生的年龄是:ageendl;cout学生的性别是:sexendl;private :char name20;int age;char sex;class Coursepublic:Course()cout请输入课程名,学分和分数coursenamecreditscore;public:char coursename20;float score;float cre

温馨提示

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

评论

0/150

提交评论