类的继承与派生综合题

合集下载

继承与派生练习题

继承与派生练习题

习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。

A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。

A.要求参数的个数不同B. 要求参数中至少有一个类型不同。

A.要求参数的个数不同。

B.要求参数中至少有一个类型不同。

C.不要求函数的返回值不同。

C 第八章继承与派生习题习题解答

C  第八章继承与派生习题习题解答

第八章继承与多态习题一.基本概念与基础知识自测题8.1填空题8.1.1 如果类α继承了类β,则类α称为(1)类,而类β称为(2)类。

(3)类的对象可作为(4)类的对象处理,反过来不行,因为(5)。

如果强制转换则要注意(6)。

答案:(1)基类(2)派生类(3)派生类(4)基类(5)派生类有一些新成员(6)只能派生类强制转换为基类8.1.2 当用public继承从基类派生一个类时,基类的public成员成为派生类的(1)成员,protected成员成为派生类的(2)成员,对private成员是(3)。

公有派生可以使其类的(4),所以公有派生是主流。

答案:(1)public成员(2)protected成员(3)不可访问(4)接口不变8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为(2)。

继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。

答案:(1)单继承(2)多重继承(3)层次(4)单继承8.1.6 C++中多态性包括两种多态性:(1)和(2)。

前者是通过(3)实现的,而后者是通过(4)和(5)来实现的。

答案:(1)编译时的(2)运行时的(3)函数和运算符的重载(4)类继承关系(5)虚函数8.2简答题(以下习题题号可能和教材不一致!)8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。

派生类构造函数各部分的执行次序是:1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。

2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。

3.派生类的构造函数体中的操作。

8.2.2什么叫派生类的同名覆盖(override)?答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。

继承与派生

继承与派生

继承与派生一、选择填空。

1、下列对派生类的描述中,()是错的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变答案:D。

2、派生类的对象对它的基类中()是可以访问的。

A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员答案:A。

3、对基类和派生类的关系描述中,()是错的。

A、派生类是基类的具体化B.派生类是基类的子集C.派生类是基类定义的延续、D.派生类是基类的组合答案:B。

4、派生类的构造函数的成员函数初始值表中,不能包含()。

A.基类的构造函数B.派生类中子对象的初始化C.基类的子对象初始化D.派生类中一般数据成员的初始化答案:C。

5、关于子类型的描述中,()是错的。

A.子类型就是指派生类是基类的子类型B.一种类型当它至少提供了另一种类型的行为,则这种类型是另一种类型的子类型C.在公有继承下,派生类是基类的子类型D.子类型关系是不可逆的答案:A。

6、关于多继承二义性的描述中,()是错的。

A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B.解决二义性的最常用的方法是对成员名的限定法C.基类和派生类中同时出现的同名函数,也存在二义性问题D.一个派生类是从两个基类派生来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,也可能出现二义性答案:C。

7、设置虚基类的目的是()。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码答案:B。

8、带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化()。

A.与虚基类下面的派生类个数有关B.多次C.二次D.一次答案:D。

二、判断下列描述的正确性,对者划∨,错者划×∨1.C++语言中,既允许单继承,有允许多继承。

C++第5章习题参考答案

C++第5章习题参考答案

1.什么是类的继承与派生?继承性是面向对象程序设计的第二个重要特性,通过继承实现了数据抽象基础上的代码重用。

继承是对许多问题中分层特性的一种自然描述,因而也是类的具体化和被重新利用的一种手段,它所表达的就是一种对象类之间的相交关系。

它使得某类对象可以继承另外一类对象的特征和能力。

继承所具有的作用有两个方面:一方面可以减少代码冗余;另一方面可以通过协调性来减少相互之间的接口和界面。

通过继承方式定义的子类也称为派生类。

2.类的三种继承方式之间的区别是什么?类的继承方式有public(公有)继承、protected(保护)继承和private(私有)继承三种。

对于不同的继承方式,会导致基类成员原来的访问属性在派生类中有所变化。

表5.1列出了不同继承方式下基类成员访问属性的变化情况。

表5.1 不同继承方式下基类成员的访问属性说明:该表第1列给出3种继承方式,第1行给出基类成员的3种访问属性。

其余单元格内容为基类成员在派生类中的访问属性。

从表中可以看出:(1) 基类的私有成员在派生类中均是不可访问的,它只能由基类的成员访问。

(2) 在公有继承方式下,基类中的公有成员和保护成员在派生类中的访问属性不变。

(3) 在保护继承方式下,基类中的公有成员和保护成员在派生类中均为保护的。

(4) 在私有继承方式下,基类中的公有成员和保护成员在派生类中均为私有的。

需要注意的是:保护成员与私有成员唯一的不同是当发生派生后,处在基类protected区的成员可被派生类直接访问,而私有成员在派生类中是不可访问的。

在同一类中私有成员和保护成员的用法完全一样。

3.派生类能否直接访问基类的私有成员?若否,应如何实现?派生类不能直接访问基类的私有成员。

具体实现方式:(1) 在类定义体中增加保护段为了便于派生类的访问,可以将基类私有成员中需提供给派生类访问的部分定义为保护段成员。

保护段成员可以被它的派生类访问,但是对于外界是隐藏起来的。

这样,既方便了派生类的访问,又禁止外界对它的派生类访问。

java继承和派生练习题

java继承和派生练习题

java继承和派生练习题【问题描述】编写一个实现小型公司的工资管理系统,利用类的继承和派生理论实现。

公司中含有四类人员:经理(manager)、技术人员(technician)、销售员(salesman)、销售经理(salesmanager)。

这些人员都是职员(employee),有姓名、月工资信息。

月工资的计算方法是:经理固定月薪8000元,技术人员每小时100元,销售员按当月销售额4%提成,销售经理既拿固定月工资5000元,也拿销售提成,销售提成为所管辖部门当月销售额的千分之5。

要求编程计算机职员的月工资并显示全部信息。

【输入形式】姓名,类型,如果是销售人员还要输入当月销售额;注意销售经理的工资计算方法;如果是技术人员请输入工作的小时数。

【输出形式】工资【样例输入】zhangsan,manager,【样例输出】zhangsan,manager, 8000【样例说明】【评分标准】package test41;import java.util.Scanner;/**** @author yw*/public class Test41 {/*** @param args the command line arguments*/public static void main(String[] args) {// TODO code application logic hereString str1 = "technician";String str2 = "manager";String str3 = "salesman";String str4 = "salesmanager";Scanner keyin = new Scanner(System.in);String input = keyin.next();String[] ss=input.split(",");String name = ss[0];String x = ss[1];if(x.equals(str1)){int hour = Integer.parseInt(ss[2]);technician a = new technician();System.out.println(name+","+x+","+a.getSalary(hour));}else if(x.equals(str2)){manager a = new manager();System.out.println(name+","+x+","+8000);}else if(x.equals(str3)){int salesmoney = Integer.parseInt(ss[2]);salesman a = new salesman();System.out.println(name+","+x+","+a.getSalary(salesmoney ));}else if(x.equals(str4)){int salesmoney = Integer.parseInt(ss[2]);salesmanager a = new salesmanager();System.out.println(name+","+x+","+a.getSalary(salesmoney ));}}}class employee{public int salary;public int getSalary(){return salary;}}class technician extends employee{public int getSalary(int hour){salary = hour*100;return salary;}}class manager extends employee{public int getSalary(int hour){salary = 8000;return salary;}}class salesman extends employee{public int getSalary(int salesmoney) {salary = (int)(salesmoney*0.04); return salary;}}class salesmanager extends employee {public int getSalary(int salesmoney) {salary = (int)(salesmoney*0.005)+5000; return salary;}}。

继承与派生

继承与派生

第7章——继承与派生一、选择题1.在c++中,类之间的继承关系具有( )。

(a) 自反性 (b) 对称性 (c) 传递性 (d) 反对称性2.下列关于类的继承描述中,( )是正确的。

(a) 派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。

(b) 派生类也是基类,所以它们是等价的。

(c) 派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。

(d) 一个基类可以有多个派生类,一个派生类可以有多个基类。

3.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的( )。

(a) public成员(b) private成员(c) protected成员(d) 友员4.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。

(a) public成员(b) private成员(c) protected成员(d) 友员5.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的( )。

(a) public成员(b) private成员(c) protected成员(d)友员6.不论派生类以何种方式继承基类,都不能直接使用基类的()。

(a) public 成员(b) private成员(c) protected成员(d) 所有成员7.下面描述中,错误的是( )。

(a) 在基类定义的public成员在公有继承的派生类中可见,也能在类外被访问。

(b) 在基类定义的protected成员在私有继承的派生类中可见。

(c) 在基类定义的公有静态成员在私有继承的派生类中可见。

(d) 访问声明可以在公有继承派生类中把基类的public成员声明为private成员。

8.在c++中,可以被派生类继承的函数是( = )。

(a) 成员函数(b)构造函数(c) 析构函数(d)友员函数9.在创建派生类对象时,构造函数的执行顺序是( = )。

(a) 对象成员构造函数—基类构造函数—派生类本身的构造函数(b) 派生类本身的构造函数—基类构造函数—对象成员构造函数(c) 基类构造函数—派生类本身的构造函数—对象成员构造函数(d) 基类构造函数—对象成员构造函数—派生类本身的构造函数10.当不同的类具有相同的间接基类时,( c )。

习题9-继承和派生

习题9-继承和派生

习题9 继承和派生一、单项选择题1、C++语言建立类族是通过()实现的。

A、类的嵌套B、虚函数C、类的继承D、抽象类2、继承具有(),即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员。

A、规律性B、传递性C、重复性D、多样性3、下列对基类和派生类关系的描述中,错误的是()。

A、派生类是基类的具体化B、派生类是基类的子集C、派生类是基类定义的延续D、派生类是基类的组合4、下列对派生类的描述中,错误的是()。

A、一个派生类可以作为另一个派生类的基类B、派生类至少有一个基类C、派生类的缺省继承方式是privateD、派生类只继承了基类的公有成员和保护成员5、下列关于继承的描述中,错误的是()。

A、析构函数不能被继承B、派生类是基类的组合C、派生类的成员除了它自己的成员外,还包含了它的基类的成员D、派生类中继承的基类成员的访问权限到派生类保持不变6、派生类的对象对它的基类成员中()是可以访问的。

A、公有继承的公有成员B、公有继承的私有成员C、公有继承的保护成员D、私有继承的公有成员7、下列说法中错误的是()。

A、公有继承时基类中的public成员在派生类中仍是public的B、公有继承时基类中的private成员在派生类中仍是private的C、私有继承时基类中的public成员在派生类中是private的D、保护继承时基类中的public成员在派生类中是protected的8、下面叙述错误的是()。

A、基类的protected成员在派生类中仍然是protected的B、基类的protected成员在public派生类中仍然是protected的C、基类的protected成员在private派生类中是private的D、基类的protected成员不能被派生类的对象访问9、下面叙述错误的是()。

A、对基类成员的访问能力在private派生类中和public派生类中是相同的B、基类的private成员在public派生类中不可访问C、基类中的public成员在protected派生类中是protected的D、基类中的public成员在protected派生类中仍然是public的10、C++体系中,不能被派生类继承的有()。

继承与派生练习题

继承与派生练习题

习题八第八章继承与派生1.下列对派生类的描述中,(D.派生类中继承的基类成员的访问权限到派生类保持不变)是错误的。

A.一个派生类可以作为另一个派生类的基类B.派生类至少有一个基类C.派生类的成员除了它自己的成员外,还包含了它的基类成员D.派生类中继承的基类成员的访问权限到派生类保持不变2. 派生类的对象对它的哪一类基类成员是可以访问的?(A.公有继承的基类的公有成员)A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员C. 公有继承的基类的私有成员D. 保护继承的基类的公有成员3. 关于多继承二义性的描述,(D.派生类和它的基类中出现同名函数时,将可能出现二义性)是错误的。

A.派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B.一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C.解决二义性最常用的方法是作用域运算符对成员进行限定D.派生类和它的基类中出现同名函数时,将可能出现二义性4. 多继承派生类构造函数构造对象时,(B.虚基类的构造函数)被最先调用。

A.派生类自己的构造函数B.虚基类的构造函数C.非虚基类的构造函数 D.派生类中子对象类的构造函数5. C++类体系中,能被派生类继承的是( B.虚函数)。

A.构造函数 B.虚函数 C.析构函数 D.友元函数6. 设有基类定义:class Cbase{ private: int a;protected: int b;public: int c;};派生类采用何种继承方式可以使成员变量b成为自己的私有成员(A. 私有继承)A. 私有继承B.保护继承C. 公有继承D.私有、保护、公有均可7. 指出下列对定义重载函数的要求中,哪些是错误的提法。

A.要求参数的个数不同B. 要求参数中至少有一个类型不同。

A.要求参数的个数不同。

B.要求参数中至少有一个类型不同。

C.不要求函数的返回值不同。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1. 类的继承与派生综合题1题目描述定义Staff(员工)类,由Staff分别派生出Saleman(销售员)类和Manager(经理)类,再由Saleman(销售员)类和Manager(经理)类采用多重继承方式派生出新类SaleManager(销售经理)类。

要求:a.在Staff类中包含的数据成员有编号(num)、姓名(name)、出勤率(rateOfAttend)、基本工资(basicSal)和奖金(prize)。

在Saleman类中还包含数据成员:销售员提成比例(deductRate)和个人销售额(personAmount),在Manager类中还包含数据成员:经理提成比例(totalDeductRate)和总销售额(totalAmount)。

在SaleManager类中不包含其他数据成员。

b.各类人员的实发工资公式如下:员工实发工资=基本工资+奖金*出勤率销售员实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例经理实发工资=基本工资+奖金*出勤率+总销售额*经理提成比例销售经理实发工资=基本工资+奖金*出勤率+个人销售额*销售员提成比例+总销售额*经理提成比例c.每个类都有构造函数、输出基本信息函数(Output)和输出实发工资函数(OutputWage)。

主函数如下:int main(){Salemanobjsale(101101, "LD", 0.88f, 1200, 800, 0.05f, 10000);Manager objmana(101102, "NXG", 0.90f, 2500, 1000, 0.10f, 20000);SaleManagerobjsalemana(101103, "HDY", 0.99f, 3500, 2000, 0.20f, 100000, 0.20f,150000);objsale.Output();cout<< "销售员的实发工资:" << " ";cout<<objsale.OutputWage(0.88f, 1200, 800, 0.05f, 10000) <<endl;cout<<endl;objmana.Output();cout<< "经理的实发工资:" << " ";cout<<objmana.OutputWage(0.90f, 2500, 1000, 0.10f, 20000) <<endl;cout<<endl;objsalemana.Output();cout<< "销售经理的实发工资:" << " ";cout<<objsalemana.OutputWage(0.99f, 3500, 2000, 0.20f, 10000, 0.20f, 150000) <<endl;cout<<endl;return 0;}输入描述略输出描述略样例输入略样例输出员工的基本信息:编号姓名出勤率基本工资奖金101101 LD 0.88 1200 800提成比例:0个人销售额:10000销售员的实发工资: 2403员工的基本信息:编号姓名出勤率基本工资奖金101102 NXG 0.9 2500 1000提成比例:0.1总销售额:20000经理的实发工资: 5399员工的基本信息:编号姓名出勤率基本工资奖金101103 HDY 0.99 3500 2000提成比例:0个人销售额:100000提成比例:0.2总销售额:150000销售经理的实发工资: 374802. 类的继承与派生综合题2题目描述创建一个银行账户的继承层次,表示银行的所有客户账户。

所有的客户都能在他们的银行账户存钱,取钱,但是账户也可以分成更具体的类型。

例如,一方面存款账户SavingsAccount依靠存款生利,另一方面支票账户CheckingAccount对每笔交易(即存款或取款)收取费用。

创建一个类层次,以Account作为基类,SavingsAccount和CheckingAccount 作为派生类。

基类Account应该包括一个double类型的数据成员balance,表示账户的余额。

该类应当提供三个成员函数。

成员函数credit可以向当前余额加钱;成员函数debit负责从账户中取钱,并且保证账户不会被透支。

如果提取金额大于账户金额,函数将保持balance不变,并打印信息“Debit amount exceeded account balance”;成员函数getBalance则返回当前balance的值。

派生类SavingsAccount不仅继承了基类Account的功能,而且还应提供一个附加的double类型数据成员interestrate表示这个账户的比率(百分比)。

SavingsAccount的构造函数应接受初始余额值和初始利率值,还应提供一个public成员函数calculateInterest,返回代表账户的利息的一个double值,这个值是balance和interestrate的乘积。

注意:类SavingsAccount应继承成员函数credit和debit,不需要重新定义。

派生类CheckingAccount不仅继承了基类Account的功能,还应提供一个附加的double类型数据成员表示每笔交易的费用。

CheckingAccount的构造函数应接受初始余额值和交易费用值。

类CheckingAccount需要重新定义成员函数credit 和debit,当每笔交易完成时,从balance中减去每笔交易的费用。

重新定义这些函数时应用(即调用)基类Account的这两个函数来执行账户余额的更新。

CheckingAccount的debit函数只有当钱被成功提取时(即提取金额不超过账户余额时)才应收取交易费。

提示:定义Account的debit函数使它返回一个bool 类型值,表示钱是否被成功提取。

然后利用该值决定是否需要扣除交易费。

如果取款或存款后,账户的余额小于每笔交易的费用,则废弃这次交易,使账户余额恢复到取款或存款之前的值,并打印“Transaction fee exceeded account balance while debiting”或“Transaction fee exceeded account balance while crediting”。

实验要求:要求将每个类的定义和实现分开在不同的文件里,并严格按照上述名称定义成员变量和成员函数,所有类的成员变量均定义为private的。

当这个继承层次中的类定义完毕后,编写一个主程序,能够生成不同的账户对象,并调用成员函数。

主函数代码:int main(){SavingsAccount savings(100, 3); //余额100元,利息3%CheckingAccount checkings1(100, 5); //余额100元,交易费5元CheckingAccount checkings2(50, 5); //余额50元,交易费5元cout<< "\nSavings Account:" <<endl;savings.debit(200);savings.debit(40);savings.credit(50);savings.debit(49);savings.debit(43);savings.credit(1);savings.credit(savings.calculateInterest());cout<< fixed <<setprecision(2);cout<< " 账户的余额为:" <<savings.getBalance() <<endl;cout<< "\nChecking Account 1:" <<endl;checkings1.debit(200);checkings1.debit(40);checkings1.credit(50);checkings1.debit(49);checkings1.debit(43);checkings1.credit(1);cout<< fixed <<setprecision(2);cout<< " 账户的余额为:" << checkings1.getBalance() <<endl;cout<< "\nChecking Account 2:" <<endl;checkings2.debit(200);checkings2.debit(40);checkings2.credit(50);checkings2.debit(49);checkings2.debit(43);checkings2.credit(1);cout<< fixed <<setprecision(2);cout<< " 账户的余额为:" << checkings2.getBalance() <<endl;return 0;}输入描述略输出描述略样例输入无样例输出Savings Account:Debit amount exceeded account balance账户的余额为:19.57Checking Account 1:Debit amount exceeded account balanceTransaction fee exceeded account balance while debiting账户的余额为:42.00Checking Account 2:Debit amount exceeded account balanceTransaction fee exceeded account balance while debitingTransaction fee exceeded account balance while crediting 账户的余额为:2.00。

相关文档
最新文档