实验8_继承和多态

合集下载

Java程序设计实验指导书(答案)

Java程序设计实验指导书(答案)

第Ⅰ部分:实验指导实验1:Java开发环境J2SE一、实验目的(1)学习从网络上下载并安装J2SE开发工具。

(2)学习编写简单的Java Application程序.(3)了解Java源代码、字节码文件,掌握Java程序的编辑、编译和运行过程。

二、实验任务从网络上下载或从CD-ROM直接安装J2SE开发工具,编写简单的Java Application程序,编译并运行这个程序。

三、实验内容1.安装J2SE开发工具Sun公司为所有的java程序员提供了一套免费的java开发和运行环境,取名为Java 2 SDK,可以从上进行下载。

安装的时候可以选择安装到任意的硬盘驱动器上,例如安装到C:\j2sdk1.4.1_03目录下。

教师通过大屏幕演示J2SE的安装过程,以及在Windows98/2000/2003下环境变量的设置方法。

2.安装J2SE源代码编辑工具Edit Plus教师通过大屏幕演示Edit Plus的安装过程,以及在Windows98/2000/2003操作系统环境下编辑Java 原程序的常用命令的用法。

3.编写并编译、运行一个Java Application程序。

创建一个名为HelloWorldApp的java Application程序,在屏幕上简单的显示一句话"老师,你好!"。

public class HelloWorldApp{public static void main(String[] args){System.out.println("老师,你好!");}}4.编译并运行下面的Java Application程序,写出运行结果。

1:public class MyClass {2:private int day;3:private int month;4:private int year;5:public MyClass() {6:day = 1;7:month = 1;8:year = 1900;9:}10:public MyClass(int d,int m,int y) {11:day = d;12:month = m;13:year = y;14:}15:public void display(){16:System.out.println(day + "-" + month + "-" + year);17:}18:public static void main(String args[ ]) {19:MyClass m1 = new MyClass();20:MyClass m2 = new MyClass(25,12,2001);21:m1.display();22:m2.display();23:}24:}运行结果:1-1-190025-12-2001实验2:Java基本数据类型一、实验目的(1)掌握javadoc文档化工具的使用方法。

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接口和异常处理

Java实验报告继承、多态、接⼝和异常处理实验5 继承、多态、接⼝和异常处理⼀、实验⽬的1、掌握Java的类和对象的声明和使⽤⽅法;2、掌握Java的类的继承和实现⽅法;3、掌握多态性在类的继承中的运⽤;4、掌握接⼝的定义与使⽤;5、掌握基本异常的处理机制;6、熟悉try语句与catch语句的搭配使⽤;7、了解有异常处理与没有异常处理的差别;8、多重catch语句的使⽤;9、使⽤Throws声明异常和Throw抛出异常。

⼆、实验环境1、PC微机;2、DOS操作系统或 Windows 操作系统;3、Java sdk程序开发环境、eclipse集成环境。

三、实验内容1. 设计三个类,分别是学⽣类Student,本科⽣类UnderGraduate,研究⽣类Postjgraduate,其中Student类是⼀个抽象类,它包含学⽣的基本信息如姓名、所学课程、课程成绩等,⽽Undergraduate类和Postgraduate类都是Student类的⼦类,这两个类计算课程成绩等级的⽅法有所不同,如下表所⽰。

假设某班级⾥既有研究⽣⼜有本科⽣,编写程序统计出全班学⽣2. 和Mobilephone具体实现,并设计⼀个应⽤程序类来使⽤这些类。

3.要求设计⼀个GUI图形窗⼝程序,该程序让⽤户输⼊⼀个星期中的任意⼀天的数字1-7,然后输出该数字所对应的是星期⼏。

四、实验步骤实验内容⼀1.建⽴package experiment5_1,其最终⽬录结构如下:2.建⽴Student类:package experiment5_1;public abstract class Student {final static int CourseNo = 3;String name;String type;int[] courses;String courseGrade;public Student(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name; courses = new int[CourseNo];courseGrade = "" ;}public abstract void calculateGrade();public String getName( ) {return name;}public String getType( ) {return type ;}public String getCourseGrade( ) {return courseGrade;}public int getCourseScore(int courseNumber) {return courses[courseNumber];}public void setName(String name) {/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html = name;}public void setType(String type) {this.type = type;}public void setCourseScore(int courseNumber, int courseScore) { //按课程索引号设置课程成绩this.courses[courseNumber] = courseScore ;}}3.建⽴外部类(1)研究⽣类Postjgraduatepackage experiment5_1;public class postgraduate extends Student {public postgraduate(String name) {super(name);type = "研究⽣";}public void calculateGrade() {// TODO Auto-generated method stubint total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += courses[i];};average = total / CourseNo;if (average>=90&&average<100) courseGrade = "优秀"; else if (average>=80&&average<90) courseGrade = "良好"; else if (average>=70&&average<80) courseGrade = "⼀般"; else if (average>=60&&average<70) courseGrade = "及格"; else courseGrade = "不及格";}}(2)本科⽣类UnderGraduatepackage experiment5_1;public class undergraduate extends Student {public undergraduate(String name ) {super(name);type = "本科⽣";}public void calculateGrade() {int total = 0;double average = 0;for (int i = 0; i < CourseNo; i++) {total += getCourseScore(i) ;};average = total / CourseNo;if (average>=80&&average<100) courseGrade = "优秀"; else if (average>=70&&average<80) courseGrade = "良好"; else if (average>=60&&average<70) courseGrade = "⼀般"; else if (average>=50&&average<60) courseGrade = "及格"; else courseGrade = "不及格";}}4.编写代码测试函数package experiment5_1;public class polymorphism {public static void main(String[] args) {Student[] students = new Student[5];students[0] = new undergraduate("陈建平");students[1] = new undergraduate("鲁向东");students[2] = new postgraduate("匡晓华");students[3] = new undergraduate("周丽娜");students[4] = new postgraduate("梁欣欣");for (int i=0; i<5 ;i++) {students[i].setCourseScore(0,87);students[i].setCourseScore(1,90);students[i].setCourseScore(2,78);}for (int i=0; i<5 ;i++) {students[i].calculateGrade();}System.out.println("姓名" + " 类型" +" 成绩");System.out.println("-----------------------");for (int i=0; i<5 ;i++) {System.out.println(students[i].getName( )+" "+students[i].getType( )+" "+students[i].getCourseGrade( ));}}}实验内容⼆1.建⽴package experiment5_2,其最终⽬录结构如下:2.写接⼝Soundable代码:package experiment5_2;public interface Soundable {public void increaseV olume( );public void decreaseV olume( );public void stopSound( );public void playSound( );}3.创建三个类Radio、Walkman和Mobilephone具体实现,分别添加代码:// Mobilephone类package experiment5_2;class Mobilephone implements Soundable{public void increaseV olume( ) {System.out.println("增⼤⼿机⾳量");}public void decreaseV olume( ) {System.out.println("减⼩⼿机⾳量");}public void stopSound( ) {System.out.println("关闭⼿机");}public void playSound( ) {System.out.println("⼿机发出来电铃声");}}// Walkman类package experiment5_2;class Walkman implements Soundable { public void increaseV olume( ) { System.out.println("增⼤随声听⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩随声听⾳量"); }public void stopSound( ) {System.out.println("关闭随声听");}public void playSound( ) {System.out.println("随声听发出⾳乐"); }}// Radio类package experiment5_2;class Radio implements Soundable{ public void increaseV olume( ) { System.out.println("增⼤收⾳机⾳量"); }public void decreaseV olume( ) { System.out.println("减⼩收⾳机⾳量"); }public void stopSound( ) {System.out.println("关闭收⾳机");}public void playSound( ) {System.out.println("收⾳机播放⼴播"); }}4.创建people类及编写测试代码://People类package experiment5_2;class People {public void listen(Soundable s) {s.playSound( );}}//测试代码package experiment5_2;import java.util.Scanner;public class InterfaceTest {public static void main(String[] args) {int i;People sportsman = new People( );Scanner scanner = new Scanner(System.in);Soundable[] soundDevice = new Soundable[3];//往声⾳设备数组中放⼊能发声的设备soundDevice[0] = new Radio( );soundDevice[1] = new Walkman( );soundDevice[2] = new Mobilephone();System.out.println("你想听什么? 请输⼊选择:0-收⾳机1-随声听2-⼿机");i = scanner.nextInt( );//开始听声⾳sportsman.listen(soundDevice[i]);soundDevice[i].increaseV olume( );soundDevice[i].stopSound();scanner.close();}}实验内容三1.建⽴package experiment5_3,其最终⽬录结构如下package experiment5_3;import java.awt.*;import java.awt.event.*;import javax.swing.*;public class DateTransf extends JFrame implements KeyListener{/****/private static final long serialVersionUID = 1L;private static DateTransf frm;private static JTextField txt;private static JTextField data;DateTransf() {setTitle("数字与星期转换");setLocation(700, 300);setSize(400,130);}public static void main(String[] args) {frm = new DateTransf();frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frm.setLayout(new GridLayout(2,2));txt = new JTextField(12);data = new JTextField(12);JLabel lable1 = new JLabel("输⼊数字:");JLabel lable2 = new JLabel("星期⼏:");frm.add(lable1);txt.addKeyListener(frm);frm.add(txt);frm.add(lable2);frm.add(data);frm.setVisible(true);}public void keyPressed(KeyEvent e) {if (e.getSource() == txt) {if (e.getKeyCode() == KeyEvent.VK_ENTER) // 判断按下的键是否是回车键{try {int number = Integer.parseInt(txt.getText());switch (number) {case 1:data.setText("Mon");break;case 2:data.setText("Tue");break;case 3:data.setText("Wen");break;case 4:data.setText("Thu");break;case 5:data.setText("Fri");break;case 6:data.setText("Sat");break;case 7:data.setText("Sun");break;default:JOptionPane.showMessageDialog(null, "您输⼊的数字不是1~7","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMATION_MESSAGE); break;}}catch (Exception e1) {// TODO: handle exceptionJOptionPane.showMessageDialog(null, "您输⼊的不是整数","⽆效⽇期",/doc/1bd4a299a66e58fafab069dc5022aaea998f41e2.html RMA TION_MESSAGE); }}}}public void keyReleased(KeyEvent e) {}public void keyTyped(KeyEvent e) {}}2.编译运⾏五、实验结果●实验内容⼀结果:●实验内容⼆结果:●实验内容三结果:六、实验⼩结1.这次实验的内容⽐较多,需要掌握Java的类和对象的声明和使⽤⽅法、Java的类的继承和实现⽅法、多态性在类的继承中的运⽤、接⼝的定义与使⽤、基本异常的处理机制、try语句与catch语句的搭配使⽤等等;2. 在实验过程中,重点是要区分好实例和类,灵活掌握类的调⽤。

JAVA实验报告心得

JAVA实验报告心得

北京联合大学信息学院“面向对象程序设计”课程上机实验报告题目: java上机实验心得体会姓名(学号):专业:计算机科学与技术编制时间: 2012年12月19日版本: 1.0.0指导教师:北京联合大学-信息学院编制实验1 熟悉java运行环境实验目的:熟悉jdk环境和操作,编写简单的java应用程序。

心得体会:在该实验中,我碰到的问题是jdk环境变量的设置。

解决方法是通过查阅资料书和网上搜索相关解决方法及同学的有力帮助。

实验2 选择语句练习实验目的:正确理解并能够熟练操作和使用java的if和switch语句。

心得体会:我个人感觉有了c的编程基础,if和switch这些简单的流程控制语句运用起来比较轻松,实现简单的逻辑运算也跟c非常相近,所以上手比较快。

但是在这次程序中,首次涉及到了java程序的数据输入,与c区别很大。

但经过老师的讲解和查阅相关资料,基本明白相关的使用规则和注意事项。

在第二个小题中还涉及到了charat()方法,经查阅jdk 文档,知道charat()方法返回一个位于提供给它的参数索引处的字符,如: str.chatat(0)检索str中的第一个字符,str.charat(str.length()-1)检索最后一个字符。

我运用此方法解决了比较字符串间首字母异同的问题。

实验3 迭代练习实验4 方法的实现练习实验目的:声明、定义和调用方法,理解实参和形参的含义。

心得体会:在该实验中,我掌握如何写方法、调用方法,并掌握如何向方法中传递信息和从方法中返回信息。

方法声明为非void(构造方法除外)则需要用return语句返回一个相应类型的返回值。

实验5 简单类型数组练习实验目的:学习创建简单类型的数组,并能用循环语句处理数组。

心得体会:通过该实验,我学会了如何让建立简单类型的数组,并掌握了将数组作为方法的传入参数和返回值。

在该实验中,遇到的问题主要是如何将一个连续的多位数在存入数组时,每个数组元素只对应改多位数的一个组成数。

类的继承与多态性实验报告

类的继承与多态性实验报告

类的继承与多态性实验报告目录1.介绍2.什么是多态3.多态在Java中的技术基础4.示例5.多态的好处6.总结介绍之前的文章介绍过类的封装性和继承性,现在是时候聊聊面向对象编程的三大特性之一的最后一个类的多态性了。

多态的基础是继承(包括了接口的实现)和方法的覆盖。

什么是多态多态对应的英文单词是polymorphism,百度翻译给出的翻译是:n.多型现象,多态性; 多机组合形式;按字面意思就是多种状态、形态、姿态等等,潜台词就是某个东西具有多种状态、形态、姿态等等。

那是什么东西呢?在面向对象的编程语言里面(当然就包括Java了)就是某个方法或函数。

那方法的多种状态、形态、姿态有是个什么意思呢?这其实是指同一个方法具有多个方法体,就是方法的实现。

而方法的相同与否是由方法签名决定的。

所以,多态其实本质上是指同一个类的同一个方法却具有不同的行为特征。

状态、形态、姿态指的就是行为特征。

多态在Java中的技术基础然而,在Java中,同一个类里面是不可能存在两个签名相同而实现不同的方法的,否则的话会导致无法判断该执行哪个方法,因此在编译时就会报错。

所以,肯定是在两个类中才有可能存在两个签名相同而实现不同的方法,一个实现在这个类,另一个实现在另一个类。

而如果这两个类毫无瓜葛,那么肯定就与多态的本质(同一个类的同一个方法却具有不同的行为特征)自相矛盾了。

所以,这两个类肯定是有某种联系的。

我们再想想,什么概念是能够让两个不同的类却又能称为同一个类的?答案就是类的继承/扩展,就是现实中的“某东西是某类东西”的概念,就是“具体和抽象”的思想。

比如,男人是人,女人也是人,男人类和女人类就借助于人类建立了某种联系,而人类具有的某个行为在男人类和女人类中是有着不同体现的,比如人类的吃饭这个行为,男人类的体现是狼吞虎咽,女人类的体现是细嚼慢咽。

例子不是很恰当,但意思就是这么个意思。

所以说,Java里面多态的技术基础就是方法的覆盖,当然,在Java中覆盖不仅仅发生在类的继承/扩展上,还可能发生在接口的实现上。

《python语言实训》面向对象程序设计实验

《python语言实训》面向对象程序设计实验

《python语言实训》面向对象程序设计实验一、实验目的1、掌握面向对象程序设计的思想。

2、掌握类的定义。

3、掌握对象的创建和使用。

4、掌握属性和方法的访问控制、★△类属性和实例属性、类的方法。

5、掌握继承、多重继承、多态。

6、掌握程序流程控制语句、函数与模块、数据结构等知识内容与面向对象程序设计的综合应用。

二、实验内容1、对象的创建和使用,在Python中,用赋值的方式创建类的实例,创建对象后,通过实例对象访问这个类的属性和方法。

2、从面向过程到面向对象,面向过程程序设计采用自顶向下的方法,分析出解决问题所需要的步骤,将程序分解为若干个功能模块,每个功能模块用函数来实现。

3、定义属性、定义方法、创建实例对象、调用属性和方法。

4、构造方法,在生成对象时调用,可以用来进行一些属性初始化操作,不需要显示去调用,系统会默认去执行。

5、类方法、实例方法和静态方法,方法的访问控制使用。

6、类与对象的应用、属性与方法的应用。

7、类中内置的方法、类方法、实例方法、静态方法。

8、继承与多态的应用、面向对象程序设计案例的应用。

9、Python程序控制结构、数据结构、函数与模块与面向对象程序设计方法的综合案例。

三、主要实验设备及器材1、计算机终端1套(配备Windous10系统或Windows7系统,英特尔i5及以上的处理器,4G以上内存,256G硬盘)。

2、多媒体教学设备1套。

3、网络设备套件1套。

4、Python软件、PyCharm软件、Anaconda软件等Python软件1套。

四、实验步骤(1)演示性实验教师利用多媒体等设备,对本章节的知识在Python语言的相关软件上进行演练。

(2)验证性实验学生指对Python的语言对象有了一定了解,并提出自己的相关问题,然后学生利用实验室的电脑设备解决问题。

(3)设计性实验设计程序以解决金融工程中的计量分析问题。

2、实验步骤(1)Python的Car对象的创建。

(2)在精灵宝可梦游戏中创建小火龙角色,对给出的各个属性进行迭代和私有化。

java实验心得体会javase部分上机心得总结_华清远见[修改版]

java实验心得体会javase部分上机心得总结_华清远见[修改版]

第一篇:java实验心得体会javase部分上机心得总结_华清远见java实验心得体会javase部分上机心得总结java作为主流开发语言之一,应用场景自然是非常的广泛,java工程师的人才的需求量也是非常大的,选择学习java的朋友也是不在少数,想要成为一名合格的java工程师需要不断的练习,并不是只看光想就行了,面试官可不会给你手下留情哦。

在java练习的时候一定要有目标,总结不一定要写但是一定要理解你所写的程序的意义何在,华清远见的学员对于这点就比较看重在练习的同时记录下来自己的目的和心得,此举希望对从事软件编程的朋友能够有一些启示。

实验1 熟悉Java运行环境实验目的:熟悉JDK环境和操作,编写简单的Java应用程序。

心得体会:在该实验中,我碰到的问题是JDK环境变量的设置。

解决方法是通过查阅资料书和网上搜索相关解决方法及同学的有力帮助。

实验2 选择语句练习实验目的:正确理解并能够熟练操作和使用Java的if和switch语句。

心得体会:我个人感觉有了C的编程基础,if和switch这些简单的流程控制语句运用起来比较轻松,实现简单的逻辑运算也跟C非常相近,所以上手比较快。

但是在这次程序中,首次涉及到了java程序的数据输入,与C区别很大。

但经过老师的讲解和查阅相关资料,基本明白相关的使用规则和注意事项。

在第二个小题中还涉及到了charAt()方法,经查阅JDK文档,知道charAt()方法返回一个位于提供给它的参数索引处的字符,如: str.chatAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。

我运用此方法解决了比较字符串间首字母异同的问题。

实验3 迭代练习实验目的:正确理解并能够熟练操作和使用Java的for、while、do..while语句。

心得体会:在该实验中,我学会了为具体操作选择最合适的循环语句及for、while、do..while语句的相互转换使用。

《java面向对象程序设计继承和多态》教案

《java面向对象程序设计继承和多态》教案

《Java面向对象程序设计-继承和多态》教案第一章:引言1.1 课程简介本课程旨在帮助学生掌握Java面向对象程序设计中的继承和多态概念。

通过学习,学生将能够理解继承和多态的原理,并能够运用它们解决实际编程问题。

1.2 课程目标理解继承的概念和原理掌握如何使用继承来实现代码复用理解多态的概念和原理掌握如何使用多态来实现动态绑定第二章:继承2.1 继承的概念介绍继承的定义和作用解释为什么使用继承2.2 继承的语法介绍如何使用extends关键字实现继承解释继承中的构造函数和继承关系2.3 继承的实现演示如何使用继承来复用代码解释继承的层次结构和菱形继承第三章:多态3.1 多态的概念介绍多态的定义和作用解释多态的好处3.2 方法重写解释方法重写的概念和规则演示如何使用方法重写来实现多态3.3 方法重载解释方法重载的概念和规则演示如何使用方法重载来提高代码可读性第四章:继承和多态的案例分析4.1 案例一:动物和鸟类使用继承和多态来定义动物和鸟类的关系实现动物和鸟类的属性和方法4.2 案例二:形状和圆形使用继承和多态来定义形状和圆形的关系实现形状和圆形的属性和方法第五章:总结和练习5.1 课程总结回顾继承和多态的概念和原理强调继承和多态在面向对象程序设计中的重要性5.2 练习题提供一些练习题,以帮助学生巩固所学知识第六章:继承和多态的深入理解6.1 继承的类型解释接口继承和类继承的区别讨论继承的优点和缺点6.2 多态的应用探讨多态在日常编程中的应用场景分析多态如何提高程序的可扩展性和灵活性第七章:Java中的继承和多态实例7.1 继承实例:汽车和摩托车通过实例展示如何使用继承来创建汽车和摩托车类演示如何通过继承来扩展属性和方法7.2 多态实例:支付接口和具体的支付方式创建一个支付接口和多个具体的支付方式类演示如何使用多态来实现不同的支付方法第八章:继承和多态的陷阱与最佳实践8.1 继承的陷阱讨论继承可能带来的过度耦合问题解释如何避免继承的陷阱8.2 多态的陷阱分析多态可能导致的类型不匹配问题探讨如何安全地使用多态8.3 最佳实践提供使用继承和多态的最佳实践指南强调代码可读性和可维护性第九章:继承和多态在设计模式中的应用9.1 设计模式简介介绍设计模式的概念和重要性解释设计模式与继承和多态的关系9.2 继承和多态在设计模式中的应用案例通过案例分析展示继承和多态如何在设计模式中发挥作用讨论设计模式如何提高程序设计的质量和可复用性第十章:课程回顾与拓展学习10.1 课程回顾总结本课程的重点内容和关键概念强调继承和多态在实际编程中的应用10.2 拓展学习资源提供一些拓展学习的资源和建议鼓励学生继续深入学习面向对象程序设计的其他方面第十一章:继承和多态的实际应用案例11.1 案例分析:图形库的设计通过分析图形库的设计,展示继承和多态如何用于实现复杂的图形操作。

c类的继承和多态例子

c类的继承和多态例子

c类的继承和多态例子继承是面向对象编程中的重要概念之一,它允许一个类“继承”另一个类的属性和方法。

在C++中,继承分为三种类型:公有继承、私有继承和保护继承。

其中,公有继承是最常用的一种方式,也是实现多态的基础。

本文将通过一个例子来介绍C++中的公有继承和多态特性。

假设我们要设计一个动物园的系统,其中包含不同类型的动物。

首先,我们定义一个基类Animal,代表所有动物的共有属性和方法。

然后,派生出几个具体的动物类,如Lion(狮子)、Elephant (大象)和Monkey(猴子),它们都是Animal类的派生类。

1. 基类Animal的定义:```c++class Animal {public:Animal() {} // 构造函数virtual ~Animal() {} // 虚析构函数virtual void move() const = 0; // 纯虚函数,用于表示不同动物的移动方式protected:int age; // 年龄double weight; // 体重};```2. 派生类Lion的定义:```c++class Lion : public Animal {public:Lion(int a, double w) : Animal(), color("yellow") { age = a;weight = w;}void move() const {std::cout << "Lion is running." << std::endl;}private:std::string color; // 颜色};```3. 派生类Elephant的定义:```c++class Elephant : public Animal {public:Elephant(int a, double w) : Animal(), height(3.5) { age = a;weight = w;}void move() const {std::cout << "Elephant is walking." << std::endl; }private:double height; // 身高};```4. 派生类Monkey的定义:```c++class Monkey : public Animal {public:Monkey(int a, double w) : Animal(), num_bananas(5) {age = a;weight = w;}void move() const {std::cout << "Monkey is jumping." << std::endl;}private:int num_bananas; // 香蕉数目};```以上就是实现动物园系统的基本类定义。

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

实验08:继承与多态实验学时:6实验类型:验证、设计实验要求:必修一、实验目的1.理解继承的概念,了解面向对象设计中继承和多态的合理性;2.掌握派生类的构造与析构;3.掌握在对象中使用类层次和继承思想进行设计、实现和测试;4.区别运行时的多态性的实现,理解重载与同名覆盖的差异;5.理解虚函数与多态性;6.实现运行时多态性的程序设计。

二、实验内容1.Difine a class called PartFileledArrayWMax that is a derived class of the class PartFilledArray. The class PartFilledArrayWMax has one additional member variable named max_value that holds the maximum value stored in the array. Define a member accessor function named get_max that returns the maximum value stored in the array. Redefine the member function add_value and define two constructors, one of which has an int argument for the maximum number of entries in the array. Also define a copy constructor, an overloaded assignment operator, and a destructor. (A real class would have more member functions, but these will do for an exercise.)2.某公司雇员(employee)包括经理(Manager)、技术人员(Technician)和销售员(Saleman)。

开发部经理(developermanager)既是经理也是技术人员,销售部经理(salesmanager)既是经理也是销售员。

以employee类为虚基类,派生出manager、technician和saleman类,再进一步派生出developermanager和salesmanager类。

Employee类的属性包括姓名、职工号、工资级别、月薪(实发基本工资加业绩工资);操作包括月薪计算函数pay(),该函数要求输入请假天数,扣除应扣工资后,得出实发基本工资。

Technician类派生的属性有每小时附加酬金和当月工作时数,以及研究完成进度系数,业绩工资为三者之积。

也包括同名的pay函数,工资总额为基本工资加业绩工资。

Saleman类派生的属性有当月销售额和酬金提取百分比,业绩工资为两者之积。

也包括同名的pay函数,工资总额为基本工资加业绩工资。

Manager类派生的属性有固定奖金额和业绩系数,业绩工资为两者之积。

工资总额也为基本工资加业绩工资。

而在developermanager类中,pay函数是将作为经理和作为技术人员业绩工资之和的一半作为业绩工资。

在salesmanager类中,pay函数则是经理的固定奖金额的一半,加上部门总销售额与提成比例之积,这是业绩工资。

编程实现工资管理。

特别注意pay()的定义和调用方法:先用同名覆盖,再用运行时多态。

3.继承范例:定义一个继承与派生关系的类体系,在派生类中访问基类成员。

[要求]定义一个点类,包含x,y 坐标数据成员,显示函数和计算面积的函数成员;以点为基类派生一个圆类,增加表示半径的数据成员,重载显示和计算面积的函数;定义一个直线类,以两个点类对象作数据成员,定义显示、求面积及长度函数。

编程测试所定义的类体系。

[程序]#include <iostream.h>#include <math.h>#define PI 3.14159class Point{friend class Line;protected:double x, y ;public:Point(){x = 0 ; y = 0 ; }Point(double xv,double yv){ x = xv; y = yv; }double Area(){return 0;}void Show() {cout<<"x="<<x<<' '<<"y="<<y<<endl;}};class Circle :public Point{double radius;public:Circle(){ x = 0; y = 0; radius = 0; }Circle(double xv,double yv,double vv):Point(xv,yv){ //调用基类构造函数radius = vv;}double Area(){return PI*radius*radius;}void Show(){//访问基类的数据成员cout<<"x="<<x<<' '<<"y="<<y<<"radius="<<radius<<endl;}};class Line{Point start,end; //对象成员public:Line():start(0,0),end(0,0){ } //对象成员初始化Line(double xv1,double yv1,double xv2,double yv2) :start(xv1,yv1),end(xv2,yv2){ }double GetLength() {return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y));}double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();}};void main(){Point pt(0,0);Circle cl(100,100,10);Line ln1(0,0,100,100);cout<<pt.Area()<<endl;pt.Show();cout<<cl.Area()<<endl;cl.Show();cout<<ln1. Area()<<'\t'<<ln1. GetLength()<<endl;ln1.Show();}[注意]在Point 类中,将Line 类定义为友元,方便在Line 中访问;Point 的x 和y 定义为Protected访问权限,便于派生类访问。

注意派生类的构造函数中对基类数据成员的初始化方法,以及构造函数中对对象成员的初始化。

[要求]1) 建立工程,录入上述程序,改变数据实验之。

2) 修改CPoint 类数据成员x,y 的访问权限为private,再运行,结果如何?3) 如果不将CLine 设为CPoint 的友元,应采取什么措施?为哪个类增加数据或函数成员?4.多态范例定义一个抽象基类CElement,提供显示、求面积等公共接口(虚函数),派生出CPoint、CLine、CCircle、CArc 等图形元素类,并重定义(override)这些虚函数,完成各自的任务。

再定义一个CElemList 链表类,存储CElement 的派生类。

然后定义main 函数,生成多个图形元素插入链表中,通过链表的头指针逐个访问链表中的元素,输出所有图形元素。

在这里,CElement 是抽象基类,它不能提供具体的显示等操作,应将其成员函数定义为纯虚函数。

只有采用指向基类的指针或对基类的引用进行调用,实现的才是动态联编,完成运行时的多态性。

[程序]//element.h#include <math.h>double const PI=3.14159class CElement {public:virtual void Show()=0;virtual double Area() = 0;CElement *Next;};class CPoint:public CElement{friend class CLine;protected:double x,y;public:CPoint(){x = 0; y = 0; }CPoint(double xv,double yv){x = xv;y = yv;}double Area(){return 0;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<endl;}};class CCircle :public CPoint{double radius;public:CCircle(){ x = 0; y = 0; radius = 0; }CCircle(double xv,double yv,double vv):CPoint(xv,yv){radius = vv;}double Area(){return PI*radius*radius;}void Show(){cout<<"x="<<x<<' '<<"y="<<y<<' '<<"radius="<<radius<<’ ’<<”Area=”<<Area()<<endl;}};class CLine:public CElement{CPoint start,end;public:CLine():start(0,0),end(0,0){}CLine(double xv1,double yv1,double xv2,double yv2):start(xv1,yv1),end(xv2,yv2){ };double GetLength(){return sqrt((start.x-end.x)*(start.x-end.x)+(start.y-end.y)*(start.y-end.y)); }double Area(){return 0;}void Show(){cout<<"start point:\n";start.Show();cout<<"end point:\n";end.Show();cout<<”Length=”<<GetLength()<<endl;}};class CElemList{protected:CElement *head; // 链表头指针定义为基类类型public:CElemList():head(NULL){}~CElemList();void Insert(CElement *); // 插入元素int Delete(CElement *); // 删除元素void Show(); // 显示所有元素CElement* GetHead(){ return head; } // 取得链表头};//element.cpp#include <iostream.h>#include "element.h"CElemList::~CElemList(){CElement *p = head,*p2;while(p){p2 = p;p = p->Next;delete p2;}return ;}void CElemList::Insert(CElement *elem){elem->Next = head; // 在表头插入结点head = elem;}int CElemList::Delete(CElement * elem){CElement *p1 = head,*p2 = head;while(p1&&p1!=elem)p2 = p1,p1 = p1->Next;if(p1==elem){if(p1!=head) p2->Next = p1->Next;else head = head->Next;delete p1;return 1;}else return 0;}void CElemList::Show(){CElement *p = head;while(p){ // 通过基类指针调用派生类成员函数,实现运行时多态性p->Show();p = p->Next;}return ;}//exp16_1.cpp#include <iostream.h>#include "element.h"void main(){CElemList list; // 定义链表类对象CElement *p1 = new CLine(100,100,100,200);list.Insert(p1);list.Show();cout<<endl;p1 = new CCircle(200,100, 20);list.Insert(p1);list.Show();cout<<endl;list.Delete(p1);list.Show();cout<<endl;}[要求]1) 建立工程,录入上述程序,改变数据实验之。

相关文档
最新文档