类的继承与派生综合题

合集下载

继承与派生练习题

继承与派生练习题

习题八第八章继承与派生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.不要求函数的返回值不同。

第二次练习-继承与派生

第二次练习-继承与派生

计算机1103 xx x号一.填空题1.类有2种用法:一是类的实例化,即生成类的对象;另一种是通过继承,派生出新类。

2.类A继承了类B,则类A称为子类,类B称为父类。

3.C++语言提供的多继承机制允许一个派生类继承多个基类,即使这些类相互无关。

二.判断1.在派生类的构造函数的初始化表中不能对包含基类的子对象初始化。

(f)2.一个派生类可以作为另一个类的基类。

(t)3.派生类至少一个基类。

4.派生类中继承的基类成员的访问权限到派生类保持不变。

(t)5.派生类的对象可以对它的基类成员中公有继承的保护成员进行访问。

(f)6.设置虚基类的目的是为了减少程序中的代码。

(f)7.派生类的构造函数执行顺序是:对象成员的构造函数,基类的构造函数,派生类本身的构造函数。

(f)8.基类的私有成员不能为派生类的成员所访问。

(t)9.基类的公有成员在私有继承时成为派生类的私有成员,而在保护继承是则成为派生类的保护成员。

(t)10.在公有和保护继承方式下,派生类的成员可以对基类的保护成员进行访问。

(t)11.在公有和保护继承方式下,派生类的对象可以对基类的保护成员进行访问。

(f)三.程序分析,根据程序写出结果。

1. #include <iostream>using namespace std;class Base{public:Base( ){cout<<”基类构造函数”<<endl;}~Base( ){cout<<”基类析构函数”<<endl;}};class Derive:public Base{Derive( ){cout<<”派生类构造函数”<<endl;}~ Derive( ){cout<<”派生类析构函数”<<endl;}};main( ){ Derive *p=new Derive;delete p;}基类构造函数派生类构造函数派生类析构函数基类析构函数2.#include <iostream>using namespace std;class A{protected: int x;public: A(int x){A::x=x;cout<<"class A"<<endl;}};class B{private: A a1;public: B(int x):a1(x){cout<<"class B"<endl;}};class C:public B{private: A a2;public: C(int x):B(x),a2(x){cout<<"class C"<endl;}};class D:public C{public: D(int x):C(x){cout<<"class D"<endl;}};void main( ){D doobj(10);}class Aclass Bclass Aclass Cclass D3.#include <iostream>using namespace std;class Base{private:int a,b;public: Base(int i,int j){a=i;b=j;}void move(int x,int y){a+=x;b+=y;}void show(){cout<<"a="<<a<<",b="<<b<<endl;} };class Derive:private Base{private: int x,y;public: Derive(int i,int j,int k,int l):Base(i,j){x=k;y=l;}void show(){cout<<"x="<<x<<",y="<<y<<endl;}void fun(){move(3,5);}void showbase(){Base::show();}};void main(){Base b(1,2);b.show();Derive d(3,4,5,6);d.fun();d.show();d.showbase();}a=1,b=2x=5,y=6a=6,b=95.#include <iostream>using namespace std;class A{public:A(char *s){cout<<s<<endl;}};class B:public A{public: B(char *s1,char *s2):A(s1){cout<<s2<<endl;}};class C:public A{public: C(char *s1,char *s2):A(s1){cout<<s2<<endl;}};class D:public B,C{public:D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s3,s4){cout<<s4<<endl;} };void main(){D d("class A","class B","class c","class D");}class Aclass Bclass cclass Dclass D6.#include <iostream>using namespace std;class A{public:A(char *s){cout<<s<<endl;}};class B:virtual public A{public: B(char *s1,char *s2):A(s1){cout<<s2<<endl;}};class C:virtual public A{public: C(char *s1,char *s2):A(s1){cout<<s2<<endl;}};class D:public B,C{public:D(char *s1,char *s2,char *s3,char *s4):B(s1,s2),C(s3,s4),A(s1){cout<<s4<<endl;}};void main(){D d("class A","class B","class c","class D");}class Aclass Bclass Dclass D四.程序填空有一个Furniture类,Bed类和Sofa类是其公有继承的派生类,Sleepersofa类是Bed和Sofa 的公有派生类,为使程序中的多重继承关系不出现模糊性,将正确内容填在线上。

C++第2 3章 类和对象类的继承与派生复习题

C++第2 3章 类和对象类的继承与派生复习题

C++第2 3章类和对象类的继承与派生复习题c++第2-3章类和对象、类的继承与派生复习题第2章类和对象一、选择题1、()不是构造函数的特征。

a、构造函数的函数名与类名相同;b、构造函数可以空载;c、构造函数可以设置缺省参数;d、构造函数必须指定类型说明。

2、下列关于构造函数的描述中,()是正确的。

a、构造函数可以设置缺省参数;b、构造函数可以被承继;c、构造函数可以对静态数据成员进行初始化;d、构造函数可以说明为虚函数;3、()是析构函数的特征。

a、析二重函数可以存有一个或多个参数;b、析二重函数名与类名相同;c、析构函数的定义只能在类体内;d、一个类中只能定义一个析构函数;4、定义析构函数时,应该注意()。

a、其函数名与类名完全相同;b、函数回到类型就是void类型;c、无形参,也不容空载;d、函数体中必须有delete语句;5、下列静态数据成员的特性中,()是错误的。

a、说明静态数据成员时前边要加修饰符static;b、静态数据成员要在类体外进行初始化;c、静态数据成员不是所有对象所共用的;d、提及静态数据成员时,必须在其名称ka和作用域运算符;6、友元的促进作用就是()。

a、提升程序的运用效率;b、强化类的PCB性;c、同时实现数据的暗藏性;d、减少成员函数的种类;7、关于成员函数特征的下列描述中,()是错误的。

a、成员函数一定是内联函数;b、成员函数可以重载;c、成员函数可以设置缺省参数值;d、成员函数可以就是静态的;8、已知:print()函数是一个类的常成员函数,它无返回值,下列表示中,(a、voidprint()const;b、constvoidprint();c、voidconstprint();d、voidprint(const);)就是恰当的;9、在()情况下适合使用inline定义内联函数。

a、函数体含有循环语句;b、函数体含有递归语句;c、函数代码小,频繁调用;d、函数代码多,不常调用;10、假设ab为一个类,则继续执行“aba(4),b[3],*p[2];”语句时,自动调用该类构造函数的次数为()。

第十一章 继承与派生 复习题

第十一章  继承与派生  复习题

第十一章继承与派生复习题1. 下面叙述错误的是( )A. 派生类可以使用private派生B. 对基类成员的访问必须是无二义性的C. 基类成员的访问能力在派生类中维持不变D. 赋值兼容规则也适用于多继承的组合2.派生类的对象对它的基类成员进行访问,可以采用对象.或者对象指针-〉的方式访问的是( )A. 公有继承的公有成员B. 公有继承的私有成员C. 公有继承的保护成员D. 私有继承的公有成员3. 当私有继承时,在派生类中成为私有成员,不能通过派生类的对象来直接访问该成员是基类的()A. 任何成员B.公有成员和保护成员C. 保护成员和私有成员D.私有成员4. C++的类有两种用法:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过()A. 复用派生出新的类B. 继承派生出新的类C. 封装派生出新的类D. 引用派生出新的类5.当保护继承时,在派生类中成为保护成员,不能通过派生类的对象来直接访问的成员是基类的()A.任何成员B.公有成员和保护成员C.保护成员和私有成员D.私有成员6.类B的数据成员中“有一个”A类的对象,这种类之间的关系是( )A.继承关系B.间接关系C.组合关系D.直接关系7. 派生类的构造函数的成员初始化列表中,不能包含( )A. 基类的构造函数B. 派生类中子对象的初始化C. 基类中子对象的初始化D. 派生类中一般数据成员的初始化8 公有成员提供了类对外部的接口,私有成员是类的内部实现,而不允许外界访问,但允许派生类访问的成员是( )A. 公有成员B. 私有成员C. 私有成员D. 保护成员9. 当公有继承时,在派生类中成为保护成员,不能通过派生类的对象来直接访问的成员是基类的( )。

A.任何成员B.公有成员和保护成员C.保护成员和私有成员D.保护成员10. 类B的对象必定是类A的对象,但是类A的对象却不属于类B,则类B和类A之间的关系是( )A.组合关系B.间接关系C.继承关系D.直接关系11. 派生可以分为公有派生和私有派生。

大连理工大学开发区c++实验五继承与派生答案

大连理工大学开发区c++实验五继承与派生答案

大连理工大学开发区c++实验五继承与派生答案
1下面对派生类的描述中,错误的是(D)。

A.一个派生类可以作为另外一个派生类的基类。

B.派生类至少有一个基类。

C.派生类的成员除了它自己的成员外,还包含了它的基类的成员。

D.派生类中继承的基类成员的访问权限到派生类中保持不变。

2下列对友元关系叙述正确的是(A)。

A.不能继承。

B.是类与类的关系。

C.是一个类的成员函数与另一个类的关系。

D.提高程序的运行效率。

3当保护继承时,基类的(B)在派生类中成为保护成员,不能通过派生类的对象来直接访问。

A.任何成员。

B.公有成员和保护成员。

C.公有成员和私有成员。

D.私有成员。

4设置虚基类的目的是(B)。

A.简化程序。

B.消除二义性。

C.提高运行效率。

D.减少目标代码。

5在公有派生情况下,有关派生类对象和基类对象的关系,不正确的叙述是(C)。

A.派生类的对象可以赋给基类的对象。

B.派生类的对象可以初始化基类的引用。

C.派生类的对象可以直接访问基类中的成员。

D.派生类的对象的地址可以赋给指向基类的指针。

课后习题答案 (2)

课后习题答案 (2)

1、什么是类的继承和派生?什么是基类和派生类?请举例说明。

答案:在原有类的基础上,通过添加一些新的、特有的属性和操作而产生出另一个新类的过程,我们称它为从原有类派生出新类,派生出的新类可以自动继承原有类的属性和操作。

在派生的过程中原有的类称为基类(或父类),新生的类称为派生类(或子类)。

例如,学生类可以派生出大学生类和中学生类,其中学生类是基类,大学生类和中学生类是它的两个派生类。

2、继承的方式有哪几种?不同的继承方式对基类成员在派生类中的访问权限有何影响?答案:类的继承方式有三种:public(公有)、protected(保护)、private(私有)。

不同的继承方式对基类成员在派生类中的访问权限影响如下:3、在创建一个派生类对象时需要对该派生类的哪些数据进行初始化?怎么实现这些初始化工作?答案:派生类对象的数据成员包括所有从基类继承的数据成员和派生类新增的数据成员,如果派生类中有内嵌对象作数据成员,那么派生类的数据成员中还间接地包含了内嵌对象的数据成员。

所以派生类对象的初始化也就是对这三类数据成员的初始化。

基类数据成员的初始化由基类构造函数来完成,内嵌对象数据成员的初始化由内嵌对象构造函数来完成,派生类新增数据成员的初始化由派生类自身的、添加的构造函数来完成。

而且在初始化前面两种数据成员时,派生类的构造函数需要隐性调用基类的构造函数和内嵌对象的构造函数。

4、什么是多继承?怎样解决多继承中的数据二义性问题?答案:一个派生类同时有多个直接基类的继承情况称为多继承。

解决多继承中的数据二义性问题的方法有两种:(1)使用作用域分隔符。

(2)将公共基类声明为虚基类。

5、分析以下程序的执行结果。

#include<iostream.h>class A{public:int n;};class B:public A{};class C:public A{};class D:public B,public C{int getn(){return B::n;}};void main(){D d;d.B::n=20;d.C::n=40;cout<<d.B::n<<","<<d.C::n<<endl;}答案:D类是从类和类派生的而类和类又都是从类派生的,但各有自己的副本。

继承与派生习题

继承与派生习题

继承与派生习题集1、如果派生类以protected方式继承基类,则原基类的protected成员和public成员在派生类中的访问属性分别是( D )A)public和public B)public和protectedC)protected和public D)protected和protected解析:根据课本中定义,当派生类以protected方式继承基类时,则原基类的protected成员和public成员在派生类中的访问属性分别是protected和protected。

2、派生类的成员函数不能访问基类的( C )A)公有成员和保护成员B)公有成员C)私有成员D)保护成员解析:基类的私有成员无论以何种方式继承,在派生类中都是不可访问的。

3、在公有派生情况下,有关派生类对象和基类对象的关系,下列叙述不正确的是(C )A)派生类的对象可以赋给基类的对象B)派生类的对象可以初始化基类的引用C)派生类的对象可以直接访问基类中的成员D)派生类的对象的地址可以赋给指向基类的指针解析:基类与派生类对象可以相互转换,(1)派生类对象可以向基类对象赋值;(2)派生类对象可以向基类对象的引用进行赋值或初始化;(3)派生类对象的地址可以赋给指向基类对象的指针变量;(4)如果函数的参数是基类对象或基类对象的引用,相应得实参可以用子类对象。

4、在一个派生类对象结束其生命周期时(A)A)先调用派生类的析构函数后再调用基类的析构函数B)先调用调用基类的析构函数后再调用派生类的析构函数C)如果基类没有定义析构函数,则只调用派生类的析构函数D)如果派生类没有定义析构函数,则只调用基类的析构函数解析:在派生类对象释放时,先执行派生类析构函数,再执行其基类析构函数。

5、在声明派生类时,如果不显式地给出继承方式,缺省的类继承方式是私有继承private。

已知有如下类定义:class Base{ protected:void fun() {} };class Derived:Base {};则Base类中的成员函数fun() ,在Derived类中的访问权限是(A)A)private B)public C)friend D)protected解析:由于是私有继承,则基类中的保护成员在私有派生类中的访问属性为私有。

最新《C++程序设计案例教程》习题答案第8章 类的继承与派生

最新《C++程序设计案例教程》习题答案第8章  类的继承与派生

第8章类的继承与派生一、选择题1.D 2.A 3.A 4.B 5.B 6.B二、程序题(略)三、简答题1.派生类对基类的继承方式有哪些?在派生类中,成员有几种不同的访问属性?答:派生类对基类的继承方式有三种:public、protected、private。

成员也有三种访问属性:public、protected、private。

2.多级派生的访问属性如何确定?答:多级派生的访问属性确定的原则与单层派生一致。

3. 在执行派生类时,如何调用基类的构造函数?答:在派生类构造函数的初始化列表中描述。

4. 对数据成员初始化时,如何对子对象初始化?答:在派生类构造函数的初始化列表中,写上子对象名(实际参数)。

5.程序中有多重继承时,系统如何调用析构函数?答:按照调用构造函数相反的顺序调用析构函数。

6.举例说明多重继承引起的二义性,如何解决此问题?多重继承指一个类从多个基类中派生而来。

如果一个派生类有多个直接基类,而这些直接基类又都派生于同一个基类,则在最终派生类中会保留间接基类中的多份数据成员,从而导致在派生类中访问这些数据成员时,可能产生错误,即二义性的错误。

C++提供了虚基类(virtual base class)的方法来解决这个问题,使得派生类在获得间接基类的数据成员时只保留一份拷贝。

7. 谈谈虚基类的作用。

在进行多重继承时,为保证最终派生类中只继承一次,通常声明该基类为所有直接派生类的虚基类。

如果虚基类中定义了带参数的构造函数,则在其所有的派生类(直接派生类或者间接派生类)中,必须通过这些派生类的构造函数对虚基类构造函数调用。

但是,其实只有最后的派生类成功地调用了虚基类的构造函数,并对虚基类的数据成员进行了初始化,其余派生类中对虚基类的调用只是形式,以形成派生类构造函数声明格式的一致性,而没有真正调用虚基类的构造函数。

这就保证了虚基类的数据成员不会被多次初始化。

四、编程题分别声明Teacher类和Cadre类,采用多重继承方式由这两个类派生出新类TC类。

c 继承与派生练习题

c 继承与派生练习题

c 继承与派生练习题C++是一种面向对象的编程语言,其中最重要的概念之一就是继承与派生。

继承允许一个类(称为派生类)从另一个类(称为基类)中继承属性和行为。

这个过程允许我们在派生类中使用基类的成员,同时还可以添加新的成员或者修改基类成员的行为。

在这篇文章中,我们将通过一些练习题来巩固与继承与派生有关的概念和技能。

这些练习题旨在帮助读者更好地理解和应用这些概念。

首先,考虑一下以下的代码段:```cppclass Shape {protected:int width, height;public:Shape(int w, int h) : width(w), height(h) {}virtual int area() = 0;};class Rectangle : public Shape {public:Rectangle(int w, int h) : Shape(w, h) {}int area() override { return width * height; }};class Triangle : public Shape {public:Triangle(int w, int h) : Shape(w, h) {}int area() override { return (width * height) / 2; }};```通过观察上述代码,我们可以看到Shape是一个基类,其派生类有Rectangle和Triangle。

这些派生类通过公有继承的方式继承了Shape类的成员。

另外,注意到Shape类中的区域函数area()被声明为纯虚函数。

接下来,我们通过一些练习题来检验对继承和派生的理解。

练习题1:向Shape的派生类中添加新的成员在给定的代码段中,尝试向Rectangle和Triangle类中添加一个新的成员,例如颜色color。

然后,尝试在main()函数中创建一个Rectangle对象和一个Triangle对象,并打印出它们的属性(包括颜色)和区域。

二级复习题6 继承和派生

二级复习题6 继承和派生

继承和派生1.C++中类的用途有两种:一种是类的实例化,即生成类的对象,并参与系统的运行;另一种是通过( )派生出新的类.A.复用B.继承C.封装D.引用2.下面不是派生类对基类的继承方式的是( )A.privateB.publicC.staticD.protected3.在C++语言中,可以从一个类派生出另一个类.派生出其他类的类称为( ),被派生的类称为( )A.派生类嵌套类B.基类派生类C.派生类基类D.抽象类基类4.下面各派生类的定义中,正确的是( )A.class A{<类的成员>};class B;A public{<类B中新增的成员>};B.class A{<类的成员>};private class B:A{<类B中新增的成员>};C.class A{<类的成员>};class B:protected A{<类B中新增的成员>};D.class A{<类的成员>};class B:A{<类B中新增的成员>};5.继承具有( ),即当基类本身也是某一个类的派生类时,底层的派生类也会自动继承间接基类的成员.A.规律性B.传递性C.重复性D.多样性6.若有以下程序:#include <iostream.h>class A{public: A(int i,int j){a=i;b=j;}void move(int x,int y){a+=x;b+=y;}void show( ){cout<<a<< “,”<<b<<endl;}private: int a,b;};class B: private A{ public:B(int i,int j):A(i,j){}void fun( ){move (3,5);}void f1( ){A::show( );}};void main( ){B d(3,4);d.fun( );d.f1( );}程序执行后的输出结果是( )A.3,4B.6,8C.6,9D.4,37.若有以下程序:#include <iostream.h>class A{ int x;public: int z;void setx(int i){x=i;}int getx( ){return x;}};class B:public A{ int m;public: int p;void setvalue(int a,int b,int c){setx(a);z=b;m=c;}void display( ){cout<<getx( )<< “,”<<z<< “,”<<m<<endl;}};void main( ){B obj;obj.setvalue(2,3,4);obj.display( );}程序运行以后的输出结果是( )A.产生语法错误B.2,3,4C.2,2,2D.4,3,28.若有以下程序:#include <iostream.h>class A{ int a;public: A(int i){a=i;}void disp( ){cout<<a<< “,”;}};class B{ int b;public: B(int j){b=j;}void disp( ){cout<<b<< “,”;}};class C:public B,public A{ int c;public: C(int k):A(k-2),B(k+2){c=k;}void disp( ){A::disp( );B::disp( );cout<<c<<endl;} };void main( ){ C obj(10); obj.disp( );}程序执行后的输出结果是( )A.10,10,10B.10,12,14C.8,10,12D.8,12,109.若有以下程序:#include <iostream.h>#define PI 3.14class Point{int x,y;public:Point(int a,int b){x=a;y=b;}int getx( ){return x;}int gety( ){return y;}};class Circle:public Point{ int r;public: Circle(int a,int b,int c):Point(a,b){r=c;}int getr( ){return r;}double area( ){return PI*r*r;}};void main( ){Circle c1(5,7,10);cout<<c1.area( )<<endl;}程序运行后的输出结果是( )A.314B.157C.78.5D.153.8610.若有以下程序:#include <iostream.h>class data{public: int x; data(int x){data::x=x;} }; class A{data d1;public: A(int x):d1(x){}void dispa( ){cout<<d1.x<< “,”;}};class B:public A{ data d2;public: B(int x):A(x-1),d2(x){}void dispb( ){cout<<d2.x<<endl;}};class C:public B{public: C(int x):B(x-1){ }void disp( ){dispa( );dispb( );} };void main( ){C obj(5);obj.disp( );}程序程序后的输出结果是( )A.5,5B.4,5C.3,4D.4,311.下面的叙述中,不符合赋值兼容规则的是( )A.派生类的对象可以赋值给基类的对象B.基类的对象可以赋值给派生类的对象C.派生类的对象可以初始化基类的引用D.派生类的对象的地址可以赋值给指向基类的指针12.下列关于虚基类的描述中,错误的是()A.虚基类子对象的初始化由派生类完成B.虚基类子对象的初始化次数与虚基类下面的派生类的个数有关C.设置虚基类的目的是消除二义性D.带有虚基类的多层派生类构造函数的成员初始化列表中都要列出对虚基类构造函数的调用13.下列类的定义中,有( )处语法错误.class Base{public:Base( ){ }Base(int i){data=i;}private:int data;};class Derive:public Base{public:Derive( ):Base(0){ }Derive(int x){d=x;}void setvalue(int i){data=i;}private:int d;};A.1B.2C.3D.414.下列关于继承的描述中,错误的是( )A.析构函数不能被继承B.派生类是基类的组合C.派生类的成员除了它自己的成员外,还包含了它的基类的成员D.派生类中继承的基类成员的访问权限到派生类保持不变15.派生类的对象对它的基类成员中的( )是可以访问的.A.公有继承的公有成员B.公有继承的私有成员C.公有继承的保护成员D.私有继承的公有成员16.下列虚基类的声明中,正确的是( )A.class virtual B:public AB.virtual class B:public AC.class B:public A virtualD.class B:vitual public A17. 下列对派生类的描述中,错误的是( )A.一个派生类可以作为另一派生类的基类B.派生类至少有一个基类C.派生类的缺省继承方式为privateD.派生类只继承了基类的公有成员和保护成员18.下列关于多继承二义性的描述中,错误的是( )A.一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性B.解决二义性的最常用的方法是对成员名的限定法C.基类和派生类中同时出现的同名函数,也存在二义性问题D.一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时可能出现二义性19.下列对基类和派生类关系的描述中,错误的是( )A.派生类是基类的具体化B.派生类是基类的子集C.派生类是基类定义的延续D.派生类是基类的组合20.基类中的( )不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口.A.公有成员B.私有成员C.私有成员函数D.保护成员21.在派生类的构造函数的成员初始化列表中,不能包含( )A.基类的构造函数B.派生类中子对象的初始化C.基类中子对象的初始化D.派生类中一般数据成员的初始化22.实现运行时的多态性要使用( )A.重载函数B.析构函数C.构造函数D.虚函数23.下面关于虚函数的描述中,正确的是( )A.虚函数是一个静态成员函数B.虚函数是一个非成员函数C.虚函数既可以在函数说明时定义,也可以在函数实现时定义D.派生类的虚函数具有相同的参数个数和类型24.在下面的4项中,用来说明虚函数的是( )A.virtualB.publicC.protectedD.private25.下面的各项描述中,正确的是( )A.对虚函数的调用一定使用动态联编B.对虚函数的调用必须使用动态联编C.对虚函数的调用一定使用静态联编D.对虚函数的调用不一定使用动态联编26.下列各函数的说明中,表示纯虚函数的是( )A.virtual int vf(int);B.void vf(int)=0;C.virtual void vf( )=0D.virtual void vf(int){ }27.下列程序的运行结果是________.#include<iostream.h>class B0{public:virtual void display ( )=0;};class B1:public B0{public:void display ( ){cout<<”B1::display( )”<<endl;}};class D1:public B1{public:void display ( ){cout<<”D1::display( )”<<endl;}};void fun(B0 *ptr){ptr->display( );}void main( ){B0 *p;B1 b1;D1 d1;p=&b1;fun(p);p=&d1;fun(p);}28.下列程序中声明一个哺乳动物Mammal类,再由此派生出类Dog,二者都定义Speak( )成员函数,基类中定义Speak( )为虚函数.主程序中分别声明一个Mammal类和Dog类的对象,再分别用对象名,函数名和指针的形式调用Speak( )函数.请填空完成以下程序.#include<iostream.h>class Mammal{public:Mammal( ){ }。

继承和派生习题

继承和派生习题

继承和派生习题一、单选题1.若类A和类B的定义如下:class A{int i,j;public:int geti(){return i;}};class B: public A{int k;public:void make(){k=i*j;}};则上述中,()是非法的表达式。

A.k=i*j B.int k; C.return i; D.void make();2.关于公有继承,下列说法错误的是()。

A.基类的公有成员和保护成员被继承后作为派生类的公有成员和保护成员。

B.派生类的其他成员可以直接访问基类的公有成员和保护成员。

C.派生类的对象可以访问基类的私有成员。

D.派生类成员和对象都无法访问基类的私有成员。

3.下列说法中错误的是()。

A.公有继承时基类中的public成员在派生类中仍是public的;B.公有继承时基类中的private成员在派生类中仍是private的;C.私有继承时基类中的public成员在派生类中是private的;D.保护继承时基类中的public成员在派生类中是protected的;4.在公有继承中,基类中的公有成员作为派生类的()。

A.公有成员B.私有成员C.保护成员D.私有成员函数5.基类中的()不允许外界访问,但允许派生类的成员访问,这样既有一定的隐藏能力,又提供了开放的接口。

A.公有成员B.私有成员C.保护成员D.私有成员函数6.在下面的表达式中,不表示虚继承的是()。

A.virtual publicB.public virtualC.publicD.virtual7.设置虚函数的声明中,正确的是()。

A.简化程序B.消除二义性C.提高运行效率D.减少目标代码8.下面叙述错误的是()。

A.基类的protected成员在派生类中仍然是protectedB.基类的protected成员在public派生类中仍然是protected的C.基类的protected成员在private派生类中是private的D.基类的protected成员不能被派生类的对象访问9.派生类的对象对它的基类成员中()是可以访问的。

继承与派生类C试题

继承与派生类C试题

继承与派生‎类知识要点1.1.掌握继承和‎派生的定义‎,派生类的定‎义方法。

(1)掌握继承的‎两种类型:单继承和多‎继承。

(2)掌握pri‎v ate,publi‎c,prote‎c ted三‎种继承方式‎的特点。

继承方式决‎定了基类中‎的成员在派‎生类中的属‎性。

三种继承方‎式的共同点‎:基类的pr‎ivate‎成员在派生‎类中不可见‎。

区别:对于私有继‎承,基类的pu‎blic、prote‎c ted成‎员在派生类‎中作为pr‎ivate‎成员;对于公有继‎承,基类的pu‎b lic、prote‎c ted成‎员在派生类‎中访问属性‎不变;对于保护继‎承,基类的pu‎blic、prote‎c ted成‎员在派生类‎中作为pr‎otect‎e d成员。

(3)掌握派生类‎中的构造函‎数和析构函‎数的使用。

基类的构造‎函数和析构‎函数不能继‎承,所以必要时‎在派生类中‎定义自己的‎构造函数和‎析构函数。

派生列的构‎造函数完成‎基类中新增‎数据成员和‎基类数据成‎员的初始化‎,基类数据成‎员的初始化‎通过基类构‎造函数来实‎现。

(4)掌握派生类‎的同名覆盖‎规则。

(5)掌握赋值兼‎容规则。

基类对象可‎以使用公有‎派生类对象‎来代替,包括:派生类对象‎可以赋值给‎基类对象;派生类对象‎可以初始化‎基类对象的‎引用;基类类型指‎针可以指向‎派生类对象‎。

2.2.掌握多重继‎承的概念、定义方法、多重继承派‎生类构造函‎数的执行顺‎序。

派生类构造‎函数的执行‎顺序是先执‎行所有基类‎的构造函数‎(顺序按照定‎义派生类时‎指定的各基‎类顺序),在执行对象‎成员所在类‎的构造函数‎(顺序按照他‎们在类中的‎声明顺序),最后执行派‎生类构造函‎数体中的内‎容。

3.3.掌握虚基类‎的概念和定‎义方法。

在多重继承‎中,如果多条继‎承路径上有‎一个公共的‎基类,则在这些路‎径的汇合点‎上的派生类‎会产生来自‎不同路径的‎公共基类的‎多个拷贝,如果用vi‎rtual‎把公共基类‎定义成虚基‎类,则只会保留‎公共基类的‎一个拷贝。

  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。

相关文档
最新文档