文档库 最新最全的文档下载
当前位置:文档库 › 类的继承性和多态性

类的继承性和多态性

类的继承性和多态性
类的继承性和多态性

实验三类的继承性和多态性

【开发语言及实现平台或实验环境】

Windows2000 或XP,JDK1.6与Eclipse6.0

【实验目的】

1. 掌握OOP方式进行程序设计的方法,

2. 了解类的继承性和多态性的作用。

【实验要求】

1. 编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序。

2. 编写体现类多态性(成员方法重载,构造方法重载)的程序。

【实验内容】

一类的继承性练习

1.进一步理解继承的含义

新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。

2.创建公共类LX3_7_P

(1)编写程序文件LX3_7_P.java,源代码如下。

public class LX3_7_P

{

protected String xm; //具有保护修饰符的成员变量

protected int xh;

void setdata(String m,int h) //设置数据的方法

{

xm =m;

xh = h;

}

public void print() //输出数据的方法

{

System.out.println(xm+", "+xh);

}

}

(2)编译LX3_7_P.java,产生类文件LX3_7_P.class。

(3)创建继承的类

a 程序功能:通过LX3_7_P 类产生子类LX3_8,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。

b 编写LX3_8.java 程序,源代码如下。

class LX3_8 extends LX3_7_P{

protected String xy;

protected String xi;

public static void main(String args[])

{

LX3_7_P p1 = new LX3_7_P();

p1.setdata("帅零",12321) ;

p1.print();

LX3_8 s1 = new LX3_8() ;

s1.setdata("郭丽娜",12345); //调用父类的成员方法

s1.xy="经济管理学院"; //访问本类的成员变量

s1.xi="信息管理系"; //访问本类的成员变量

s1.print();

System.out.print(s1.xm+", "+s1.xy+", "+s1.xi);

}

}

运行结果:

帅零, 12321

郭丽娜, 12345

郭丽娜, 经济管理学院, 信息管理系

(3)编译并运行程序。

3.了解成员变量的隐藏方式

所谓隐藏是指子类重新定义了父类中的同名变量,在子类Line 中重新定义了x 为x1,y 为y1,隐藏了父类Point 中的两个成员变量x 和y。子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给程序带来麻烦。

4.了解成员方法的覆盖方式

(1)方法覆盖的定义与作用

通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。例如,子类可以修改层层继承下来的Object 根类的toString 方法,让它输出一些更有用的信息。下面的程序显示了在子类Circle 中添加toString 方法,用来返回圆半径和圆面积信息。

(2)编写覆盖Object 类toString 方法的程序文件LX3_9.java,源代码如下。

class Circle {

private int radius;

Circle(int r) {

setRadius(r);

}

public void setRadius(int r) {

radius=r;

}

public int getRadius() {

return radius;

}

public double area() {

return 3.14159*radius*radius;

}

public String toString() {

return "圆半径:"+getRadius()+" 圆面积:"+area();

}

}

public class LX3_9{

public static void main(String args[]) {

Circle c=new Circle(10);

System.out.println("\n"+c.toString());

}

}

运行结果:

圆半径:10 圆面积:314.159

(3)编译并运行程序。

(4)程序结构分析。

程序添加了toString 方法并修改了它的返回值。由于toString 和继承下来的Object 类的方法名相同、返回值类型相同,因此覆盖了超类Object 中的toString 方法。

方法覆盖时要特别注意:

用来覆盖的子类方法应和被覆盖的父类方法保持同名、相同的返回值类型,以及相同的参数个数和参数类型。

5.This、super 和super()的使用

(1)程序功能:说明this、super 和super()的用法。程序首先定义Point(点)类,然后创建点的子类Line(线)。最后通过LX3_10 类输出线段的长度。

程序中通过super(a,b)调用父类Point 的构造方法为父类的x 和y 赋值。在子类Line 的setLine方法中,因为参数名和成员变量名相同,为给成员变量赋值,使用this 引用,告诉编译器是为当前类的成员变量赋值。在length 和toString 方法中使用父类成员变量时,使用super 引用,告诉编译器使用的是父类的成员变量。

(2)使用this、 super 和super()的程序文件LX3_10.java,源代码如下。

class Point {

protected int x, y;

Point(int a, int b) {

setPoint(a, b);

}

public void setPoint(int a, int b) {

x=a;

y=b;

}

}

class Line extends Point {

protected int x, y;

Line(int a, int b) {

super(a, b);

setLine(a, b);

}

public void setLine(int x, int y) {

this.x=x+x;

this.y=y+y;

}

public double length() {

int x1=super.x, y1=super.y, x2=this.x, y2=this.y;

return Math.sqrt((x2-x1) * (x2-x1) + (y2-y1) * (y2-y1));

}

public String toString() {

return "直线端点:[" + super.x + "," + super.y + "] [" +

x + "," + y + "] 直线长度:" + this.length();

}

}

public class LX3_10{

public static void main(String args[]) {

Line line=new Line(50, 50);

System.out.println("\n"+line.toString());

}

}

运行结果:

直线端点:[50,50] [100,100] 直线长度:70.71067811865476

(3)编译并运行程序。

二类的多态性练习

1.理解类的多态性

类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在OOP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。

2.方法的重载

3.构造方法的重载

构造方法的名称和类同名,没有返回类型。构造方法不能直接调用,只能由new 操作符调用,主要用来完成对象的初始化。重载构造方法的目的是提供多种初始化对象的能力,使程序员可以根据实际需要选用合适的构造方法来初始化对象。

(1)程序功能:编写构造方法RunDemo 的重载程序文件LX3_12,源代码如下。

(2)源代码:

class RunDemo {

private String userName, password;

RunDemo() {

System.out.println("全部为空!");

}

RunDemo(String name) {

userName=name;

}

RunDemo(String name, String pwd) {

this(name);

password=pwd;

check();

}

void check() {

String s=null;

if (userName!=null)

s="用户名:"+userName;

else

s="用户名不能为空!";

if (password!="12345678")

s=s+" 口令无效!";

else

s=s+" 口令:********";

System.out.println(s);

}

}

public class LX3_12 {

public static void main(String[] args) {

new RunDemo();

new RunDemo("刘新宇");

new RunDemo(null,"邵丽萍");

new RunDemo("张驰","12345678");

}

}

运行结果:

全部为空!

用户名不能为空!口令无效!

用户名:张驰口令:********

(2)编译并运行程序。

【完成实验项目】

1. 假如我们在开发一个系统时需要对员工进行建模,员工包含3个属性:姓名、工

号以及工资。经理也是员工,除了含有员工的属性外,另外还有一个奖金属性。请使用继承的思想设计出员工类和经理类。要求类中提供必要的方法进行属性访问。

第一个程序的源代码:

class employee {

String name;

int no;

int sul;

public employee(String a,int b, int c){

name=a;

no=b;

sul=c;

}

public void show(){

System.out.println("姓名: "+name+" 工号: "+no+" 工资: "+sul);

}

}

class manager extends employee{

int reward;

public manager(String a,int b, int c,int d){

super(a,b,c);

reward=d;

}

public void show(){

System.out.println("姓名: "+name+" 工号: "+no+" 工资: "+sul+" 奖金: "+reward);

}

}

public class test1{

public static void main(String[] args) {

employee em=new employee("张三",256,1800);

em.show();

manager ma=new manager("李好",13,2100,3000);

ma.show();

}

}

运行结果:

姓名: 张三工号: 256 工资: 1800

姓名: 李好工号: 13 工资: 2100 奖金: 3000

2.定义一个自己的数学类MyMath。类中提供静态方法max,该方法接收3个同类型的参数(例如整形),返回其中的最大值。

第二个程序的源代码:

Class MyMath{

int a,b,c;

Public MyMath(int x,int y,intz){

a=x;

b=y;

c=z;

}

Public static int max(){

If(a>b){

if(a>c) return a;

else return c;

}

else if(b>c) return b;

else return c;

public class test2 {

public static void main(String[] args) {

MyMath my=new MyMath(-46,23,45);

System.out.println("最大值:"+my.max());

}

}

运行结果:最大值:45

下面是红玉写的:

public class MyMath{

public static int max(int a,int b,int c){

int m=0;

if(a>b){

if(a>c)

m=a;

else

m=c;

}

else

if(b>c)

m=b;

else

m=c;

return m;

}

public static void main (String[] args) {

System.out.println("最大值:"+MyMath.max(1,2,3));

}

}

3. 以点类作为基类,从点派生出圆,从圆派生圆柱,设计成员函数输出它们的面积

和体积。

第三个程序的源代码:

class point {

}

class circle extends point{

double r;

public circle(double m){

r=m;

}

public double area(){

return 3.14*r*r;

}

}

class cylinder extends circle{

private double m;

double h;

public cylinder(double n,double m){

super(m);

h=n;

}

public double area(){

return (2*3.14*r*r+2*3.14*r*h);

}

public double size(){

return 3.14*r*r*h;

}

}

public class test3{

public static void main(String[] args) {

circle a=new circle(3.2);

System.out.println("面积:"+a.area());

cylinder b=new cylinder(3.2,10.0);

System.out.println("面积:"+b.area()+" 体积:"+b.size());

}

}

运行结果:

面积:32.153600000000004

面积:828.96 体积:1004.8000000000001

实验04 类的继承与多态

实验四类的继承与多态 一、实验目的 1.掌握构造方法和成员方法重载的应用。 2.理解类的继承性的作用 3.领会面向对象编程的多态性。 二、实验内容与要求 基本概念 1.进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。 当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。 Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少 有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 2.了解成员变量的隐藏方式 所谓隐藏是指子类重新定义了父类中的同名变量,在子类L ine 中重新定义了x为x1,y 为y1,隐藏了父类Point 中的两个成员变量x 和y。子类执行自己的方法时,操作的是子类的变量,子类执行父类的方法时,操作的是父类的变量。在子类中要特别注意成员变量的命名,防止无意中隐藏了父类的关键成员变量,这有可能给程序带来麻烦。 3.了解成员方法的覆盖方式 (1)方法覆盖的定义与作用通过继承子类可以继承父类中所有可以被子类访问的成员方法,但如果子类的方法与父类方法同名,则不能继承,此时称子类的方法覆盖了父类的方法,简称为方法覆盖(override)。方法覆盖为子类提供了修改父类成员方法的能力。 4.理解类的多态性类的继承发生在多个类之间,而类的多态只发生在同一个类上。在一个类中,可以定义多个同名的方法,只要确定它们的参数个数和类型不同。这种现象称为类的多态。多态使程序简洁,为程序员带来很大便利。在O OP 中,当程序要实现多个相近的功能时,就给相应的方法起一个共同的名字,用不同的参数代表不同的功能。这样,在使用方法时不论传递什么参数,只要能被程序识别就可以得到确定的结果。 类的多态性体现在方法的重载(overload)上,包括成员方法和构造方法的重载。 实践应用

实验六继承性与多态性

湖北工业大学工程技术学院实验报告 课程名称:面向对象程序设计实验内容:实验六继承性与多态性 学院:工程技术学院专业班级: 姓名:学号:指导教师: 实验日期:实验地点: 一、实验目的 1、1、了解多态性的概念。 2、2、了解虚函数的作用及使用方法。 3、3、了解纯虚函数和抽象类的概念和用法。 二、实验步骤 1.设计一个类层次,其中的基类为Date,它拥有一个相关数据成员及一个虚函 数print,从Date类派生ShortE、MediumDate和LongDate类,Date的print 函数使用日期格式:11-26-2015, ShortE的print函数使用日期格式:26-11-2015 MediumDate的print函数使用日期格式:Nov.26,2015 LongDate的print函数使用日期格式:November 26, 2015 编写一个程序来测试各个类的print函数。 #include using namespace std; class Date { protected: int year,month,day; public: Date(int y,int m,int d) { year=y; month=m;

day=d; } virtual void print() { cout<

继承与多态习题

继承与多态习题 一.基本概念与基础知识自测题 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.3 利用继承能够实现(1)。这种实现缩短了程序开发的时间,VC++中的(2)很 好地体现了这一点。 答案:(1)代码的复用 (2)MFC编程 8.1.4 一个派生类只有一个直接基类的情况称为(1),而有多个直接基类的情况称为 (2)。继承体现了类的(3)概念,这在MFC中得到了很好表现,MFC中只采用了(4)。 答案:(1)单继承 (2)多重继承 (3)层次 (4)单继承 8.1.5 C++中多态性包括两种多态性:(1)和(2)。前者是通过(3)实现的, 而后者是通过(4)和(5)来实现的。 答案:(1)编译时的 (2)运行时的 (3)函数和运算符的重载 (4)类继承关系 (5)虚函数 8.1.6 在基类中将一个成员函数说明成虚函数后,在其派生类中只要(1)、(2)和

(3)完全一样就认为是虚函数,而不必再加关键字(4)。如有任何不同,则认为是(5)而不是虚函数。除了非成员函数不能作为虚函数外,(6)、(7)和(8)也不能作为虚函数。 答案:(1)同虚函数名 (2)同参数表 (3)同返回类型。如基类中返回基类指针,而派生类中返回派生类指针是允许的 (4)virtual (5)重载 (6)静态成员函数 (7)内联函数 (8)构造函数 8.1.7 纯虚函数定义时在函数参数表后加(1),它表明程序员对函数(2),其本质 是将指向函数体的指针定为(3)。 答案:(1)=0 (2)不定义 (3)NULL 8.2简答题 8.2.1构造函数和析构函数可以继承吗?派生类构造函数各部分的执行次序是怎样的?答:构造函数和析构函数不可以继承。派生类构造函数各部分的执行次序是: 1.调用基类构造函数,按它们在派生类声明的先后顺序,依次调用。 2.调用新增成员对象的构造函数,按它们在类定义中声明的先后顺序,依次调用。 3.派生类的构造函数体中的操作。 8.2.2什么叫派生类的同名覆盖(override)? 答:如果派生类声明了一个和某个基类成员同名的新成员(当然如是成员函数,参数表也必须一样,否则是重载),派生类中的新成员就屏蔽了基类同名成员,类似函数中的局部变量屏蔽全局变量。称为同名覆盖(override)。 8.2.3派生类的析构函数中需完成什么任务?是否要编写对基数和成员对象的析构函数的 调用?为什么? 答:析构函数的功能是作善后工作,析构函数无返回类型也没有参数,情况比较简单。派生类析构函数定义格式与非派生类无任何差异,不要编写对基数和成员对象的析构函数的调用,只要在函数体内把派生类新增一般成员处理好就可以了,因为对新增的成员对象和基类的善后工作,系统会自己调用成员对象和基类的析构函数来完成。 8.2.4为什么要使用虚基类?怎样定义虚基类?用一个实例来解释虚基类在其派生类中的 存储方式。 答:在多重继承是有可能出现同一基类的两个拷贝,为避免这种情况,可使用虚基类。虚基类(virtual base class)定义方式如下: class派生类名:virtual 访问限定符基类类名{...}; class派生类名:访问限定符virtual基类类名{...}; virtual 关键字只对紧随其后的基类名起作用。

C 的封装性、继承性和多态性概念

C++的封装性、继承性和多态性概念 封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,一特定的访问权限来使用类的成员。例如,在抽象的基础上,我们可以将时钟的数据和功能封装起来,构成一个时钟类。按c++的语法,时钟类的声明如下:class Clock { public: //共有成员,外部借口void SetTime(int NewH,int NewM,int NewS); void ShowTime(); private: //私有成员,外部无法访问int Hour,Minute,Second; } 可以看到通过封装使一部分成员充当类与外部的接口,而将其他的成员隐蔽起来,这样就达到了对成员访问权限的合理控制,使不同类之间的相互影响减少到最低限度,进而增强数据的安全性和简化程序的编写工作。什么是多态(Polymorphisn)?按字面的意思就是“多种形状”。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为和一个或更多的他的子对象相等 的技术,赋值之后,>>>父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作<<<(摘自“Delphi4 编程技术内幕”)。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function)实现的。好,接着是“虚函数”(或者是“虚方法”)。虚函数就是允许被其子类重新定

义的成员函数。而子类重新定义父类虚函数的做法,称为“覆盖”(override),或者称为“重写”。“继承”是面向对象软件技术当中的一个概念。如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类"。继承可以使得子类具有父类的各种属性和方法,而不需要再次编写相同的代码。在令子类继承父类的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类的原有属性和方法,使其获得与父类不同的功能。 ... 继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的"父亲",而这些子实体则是汽车的"孩子"。19. 多态的作用?主要是两个:1. 隐藏实现细节,使得代码能够模块化;扩展代码模块,实现代码重用; 2. 接口重用:为了类在继承和派生的时候,保证使用家族中任一类的实例的某一属性时的正确调用。

Java继承与多态实验报告

西安邮电大学 (计算机学院) 课内实验报告 实验名称:继承与多态 专业名称:计算机科学与技术 班级:计科1405班 学生姓名:高宏伟 学号:04141152 指导教师:刘霞林 实验日期:2016.10.13

一、实验目的 通过编程和上机实验理解Java 语言的继承和多态特性,掌握变量的隐藏、方法的覆盖、重载,掌握抽象类和接口的使用。 二、实验要求 1.编写体现类的继承性(成员变量、成员方法、成员变量隐藏)的程序。 2.编写体现类的多态性(成员方法重载)的程序。 3.编写体现类的多态性(构造方法重载)的程序。 4.编写使用接口的程序。 三、实验内容 (一)类的继承 1.创建公共类Student. (1)编写程序文件Student.java,源代码如下: public class Student { protected String name; //具有保护修饰符的成员变量 protected int number; void setData(String m,int h) //设置数据的方法 { name =m; number= h; } public void print() //输出数据的方法 { System.out.println(name+", "+number); } } (2)编译Student.java,产生类文件Student.class。 2.创建继承的类Undergraduate

(1)程序功能:通过Student 类产生子类undergraduate,其不仅具有父类的成员变量name()、number(学号),还定义了新成员变量academy(学院)、department (系)。在程序中调用父类的print 方法。 (2)编写Undergraduate 程序: class Undergraduate extends Student { 【代码1】//定义成员变量academy 【代码2】//定义成员变量department public static void main(String args[]) { 【代码3】//创建一个学生对象s 【代码4】//用父类的setData方法初始化对象s 【代码5】//对象s调用print方法 【代码6】//创建一个大学生对象u 【代码7】//调用父类的成员方法setData初始化对象u 【代码8】//设置对象u的成员变量academy 【代码9】//设置对象u的成员变量department System.out.print(https://www.wendangku.net/doc/8a3174359.html,+", "+u.number+", "+u.academy+", "+u.department); } } (3)编译并运行程序 注意:公共类Student 与undergraduate 类要在同一文件夹(路径)。 (二)方法的重载 (1)程序功能:对不同的数进行排序输出。在IntSort 类中定义3 个同名的方法sort。 (2)编写Sort.java 文件,源代码如下。 import java.awt.Graphics; import java.applet.Applet; class IntSort { public String sort(int a, int b) { if (a>b) return a+""+b; else return b+""+a; } public String sort(int a, int b, int c) { int swap; if (a

类的继承性和多态性

南京信息工程大学实验(实习)报告 实验(实习)名称类的继承性和多态性实验(实习)日期得分指导教师陈遥 系计算机专业网络工程年级 2014 班次 2 姓名刘信言学号 20142346074 一、实验目的 1.掌握Java语言的类的继承的概念。 2.掌握Java语言中抽象类的使用。 3.掌握Java语言中接口的使用 二、实验内容及步骤 1.类的继承,具体要求如下: (1)定义一Person类,该类具有属性人名、年龄、身份证号等信息以及将属性信息作为字符串返回的 方法; (2)定义一Student类,让该类继承Person类,该类除了具有属性人名、年龄、身份证号等信息以外还有学号,所在学校等信息;该类也具有将属性信息作为字符串返回的一方法; (3)编写测试类,测试这两个类 【源程序】

【运行效果图】

2.定义一个动物抽象类Animal,该类有一个抽象的方法cry();定义一个小猫类Cat,该类继承了Animal 类并实现了cry()方法,当调用cry()方法时打印“小猫喵喵叫”,定义一个小狗类Dog,该类也继承了Animal类并实现了cry()方法,当调用cry()方法时打印“小狗汪汪叫”。 【源程序】 【运行效果图】

3. 接口的运用。 定义一接口接口名叫Usb,该接口声明了两个方法分别为start()和stop()方法,定义一U盘类UsbDiskWriter,一照相机类Camera、一手机类Mobile,让它们都实现该接口。 【源程序】

【运行效果图】

五、结果分析 1. 子类若想调用父类的构造函数必须要用super关键字。 2.接口体中只能运用抽象类。 3.在同一个java文件中只能在入口函数的类中用public。

对多态性和继承的理解

C#中的继承符合下列规则: 1、继承是可传递的。如果C从B中派生,B又从A中派生,那么C不仅继承了B中声明的成员,同样也继承了A中的成员。Object 类作为所有类的基类。 2、派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。 3、构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样的访问方式,都能被继承。基类中成员的访问方式 只能决定派生类能否访问它们。 4、派生类如果定义了与继承而来的成员同名的新成员,就可以覆盖已继承的成员。但这并不因为这派生类删除了这些成员,只是不能再 访问这些成员。 5、类可以定义虚方法、虚属性以及虚索引指示器,它的派生类能够重载这些成员,从而实现类可以展示出多态性。 6、派生类只能从一个类中继承,可以通过接吕实现多重继承。 多态性 在C#中,多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。C#支持两种类型的多态性: ●编译时的多态性 编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 ●运行时的多态性 运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操

作。C#中,运行时的多态性通过虚成员实现。 编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。 2、实现多态 多态性是类为方法(这些方法以相同的名称调用)提供不同实现方式的能力。多态性允许对类的某个方法进行调用而无需考虑该方法所提供的特定实现。可以用不同的方式实现组件中的多态性: ●接口多态性。 ●继承多态性。 ●通过抽象类实现的多态性。 接口多态性 多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。组件编程中的一项强大技术是能够在一个对象上实现多个接口。每个接口由一小部分紧密联系的方法、属性和事件组成。通过实现接口,组件可以为要求该接口的任何其他组件提供功能,而无需考虑其中所包含的特定功能。这使后续组件的版本得以包含不同的功能而不会干扰核心功能。其他开发人员最常使用的组件功能自然是组件类本身的成员。然而,包含大量成员的组件使用起来可能比较困难。可以考虑将组件的某些功能分解出来,作为私下实现的单独接口。 根据接口来定义功能的另一个好处是,可以通过定义和实现附加接口增量地将功能添加到组件中。优点包括:

C++习题3(继承和多态)

一、选择题 1. 在C++中,类与类之间的继承关系具有(C ) A)自反性B)对称性C)传递性D)反对称性 2. 在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(B A)受限制B)保持不变C)受保护D)不受保护 3. 按解释中的要求在下列程序划线处填入的正确语句是: (C ) #in elude class Base{ public: void fun(){coutfun(); 4. 在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限(C ) A)受限制B)保持不变C)受保护D)不受保护 5. 在哪种派生方式中,派生类可以访问基类中的protected 成员(B ) A)public 禾口private B)public 、protected 禾口 private C)protected 禾口private D)仅protected

6. 当一个派生类仅有protected继承一个基类时,基类中的所有公有成员成为派生类的(C) A) public 成员B) private 成员C) protected

成员D) 友元 7. 不论派生类以何种方法继承基类,都不能使用基类的(B ) A) public 成员B) private 成员C) protected 成员D) public 成员和protected 成员 8 下面叙述错误的是( S )。 A) 基类的protected 成员在派生类中仍然是protected 的 B) 基类的protected 成员在public 派生类中仍然是protected 的 C) 基类的protected 成员在private 派生类中是private 的 D) 基类的protected 成员不能被派生类的对象访问 9. 下列说法中错误的是( S )。 A) 保护继承时基类中的public 成员在派生类中仍是public 的 B) 公有继承时基类中的private 成员在派生类中仍是private 的 C) 私有继承时基类中的public 成员在派生类中是private 的 D) 保护继承时基类中的public 成员在派生类中是protected 的 10下面叙述错误的是( C)。 A) 派生类可以使用private 派生 B) 对基类成员的访问必须是无二义性的 C) 基类成员的访问能力在派生类中维持不变 D) 赋值兼容规则也适用于多继承的组合 11派生类的构造函数的成员初始化列表中,不能包含(C )。 A) 基类的构造函数B) 派生类中子对象 的初始化 C) 基类中子对象的初始化D) 派生类中一般数 据成员的初始化 12. 下列虚基类的声明中,正确的是: ( B ) A)class virtual B: public A B)class B: virtual public A C)class B: public A virtual D)virtual class B: public A 13..实现运行时的多态性采用(D ) A)重载函数B)构造函数C)析构函数D)虚函数 14. 若一个类中含有纯虚函数,则该类称为(D )

类的继承性练习

实验七类的继承性练习 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。 当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。 Java 提供了一个庞大的类库让开发人员继承和使用。设计这些类是出于公用的目的,因此,很少有某个类恰恰满足你的需要。你必须设计自己的能处理实际问题的类,如果你设计的这个类仅仅实现了继承,则和父类毫无两样。所以,通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 6.1、创建将被继承的类 (1) 程序源代码如下。 public class EXP3_7 { protected String xm; //具有保护修饰符的成员变量 protected int xh; void setdata(String m,int h) //设置数据的方法 { xm =m; xh = h; } public void print() //输出数据的方法 { System.out.println(xm+", "+xh); } } (2) 编译源程序。 6.2、创建将被继承的类 (1) 程序功能:通过EXP3_7类产生子类EXP3_8,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。 (2) 程序源代码如下。

通过实例理解继承与多态原理与优点

通过实例理解继承与多态原理与优点 一引子 都说面向对象的4大支柱是抽象,封装,继承与多态。但是一些初涉编程的开发人员,体会不到继承与多态的妙用,本文就试以一个经典实例来诠释继承与多态的用武之地。 二需求 1. 任务说明 我们的需求是一个影片出租的小应用,该应用会记录每个顾客的消费金额并打印出来。程序输入为:顾客租的影片及对应的租期; 程序的处理为:根据顾客租用影片时间及影片类型,计算费用;输出:打印消费单。 影片有三种类型:普通影片、儿童影片及新上映影片。 另外,模仿时下潮流,程序还提供了积分制度,为常客计算积分,积分会根据影片是否为新上映影片而不同。 2. 本实例为控制台程序,运行界面如下: 三非继承多态实现方式 根据需求,我们定义三个类,分别是movie类,Rental类(代表一条租用记录)和Customer 类(租碟顾客)

其中movie类的代码如下: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace _https://www.wendangku.net/doc/8a3174359.html,tbed 7 { 8 public enum TYPE 9 { 10 REGULAR, 11 NEW_RELEASE, 12 CHILDRENS 13 } 14 15 class Movie 16 { 17 private string _title; //movie name 18 TYPE _typeCode; //price code 19 20 public Movie() 21 { 22 _title = "unname"; 23 _typeCode = 0; 24 } 25 26 public Movie(string title, TYPE typeCode) 27 { 28 _title = title; 29 _typeCode = typeCode; 30 } 31 32 public TYPE getTypeCode() 33 { 34 return (TYPE)_typeCode; 35 } 36 37 void setTypeCode(TYPE arg) 38 { 39 _typeCode = arg; 40 } 41 42 public string getTitle() 43 {

C++习题3(继承和多态)

习题3 一、选择题 1.在C++中,类与类之间的继承关系具有( C ) A)自反性B)对称性C)传递性D)反对称性 2.在公有继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( B ) A)受限制B)保持不变C)受保护D)不受保护 3.按解释中的要求在下列程序划线处填入的正确语句是:( C ) #include class Base{ public: void fun(){cout<<"Base::fun"<fun(); 4.在保护继承的情况下,基类的成员(私有的除外)在派生类中的访问权限( C ) A)受限制B)保持不变C)受保护D)不受保护5.在哪种派生方式中,派生类可以访问基类中的protected 成员(B ) A)public和private B)public、protected和private C)protected和private D)仅protected 6.当一个派生类仅有protected继承一个基类时,基类中的所

有公有成员成为派生类的(C) A) public成员B) private成员C) protected成员 D) 友元 7.不论派生类以何种方法继承基类,都不能使用基类的(B ) A) public成员B) private成员C) protected成员D) public成员和protected成员 8下面叙述错误的是(S )。 A)基类的protected成员在派生类中仍然是protected的 B)基类的protected成员在public派生类中仍然是protected 的 C)基类的protected成员在private派生类中是private的 D)基类的protected成员不能被派生类的对象访问 9.下列说法中错误的是(S )。 A) 保护继承时基类中的public成员在派生类中仍是public 的 B)公有继承时基类中的private成员在派生类中仍是private 的 C)私有继承时基类中的public成员在派生类中是private的 D)保护继承时基类中的public成员在派生类中是protected 的 10下面叙述错误的是(C)。 A)派生类可以使用private派生 B)对基类成员的访问必须是无二义性的 C)基类成员的访问能力在派生类中维持不变 D)赋值兼容规则也适用于多继承的组合 11派生类的构造函数的成员初始化列表中,不能包含(C )。 A)基类的构造函数B)派生类中子对象的初始化 C)基类中子对象的初始化D)派生类中一般数据成员的初始化 12.下列虚基类的声明中,正确的是:( B ) A)class virtual B: public A B)class B: virtual public A

类的继承性和多态性

实验三类的继承性和多态性 【开发语言及实现平台或实验环境】 Windows2000 或XP,JDK1.6与Eclipse6.0 【实验目的】 1. 掌握OOP方式进行程序设计的方法, 2. 了解类的继承性和多态性的作用。 【实验要求】 1. 编写体现类的继承性(成员变量,成员方法,成员变量隐藏)的程序。 2. 编写体现类多态性(成员方法重载,构造方法重载)的程序。 【实验内容】 一类的继承性练习 1.进一步理解继承的含义 新类可从现有的类中产生,并保留现有类的成员变量和方法并可根据需要对它们加以修改。新类还可添加新的变量和方法。这种现象就称为类的继承。当建立一个新类时,不必写出全部成员变量和成员方法。只要简单地声明这个类是从一个已定义的类继承下来的,就可以引用被继承类的全部成员。被继承的类称为父类或超类(superclass),这个新类称为子类。通常要对子类进行扩展,即添加新的属性和方法。这使得子类要比父类大,但更具特殊性,代表着一组更具体的对象。继承的意义就在于此。 2.创建公共类LX3_7_P (1)编写程序文件LX3_7_P.java,源代码如下。 public class LX3_7_P { protected String xm; //具有保护修饰符的成员变量 protected int xh; void setdata(String m,int h) //设置数据的方法 { xm =m; xh = h; } public void print() //输出数据的方法 { System.out.println(xm+", "+xh); } } (2)编译LX3_7_P.java,产生类文件LX3_7_P.class。 (3)创建继承的类 a 程序功能:通过LX3_7_P 类产生子类LX3_8,其不仅具有父类的成员变量xm(姓名)、xh(学号),还定义了新成员变量xy(学院)、xi(系)。在程序中调用了父类的print 方法,同时可以看出子类也具有该方法。 b 编写LX3_8.java 程序,源代码如下。 class LX3_8 extends LX3_7_P{ protected String xy; protected String xi;

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

类的继承与多态性实验报告 目录 1.介绍 2.什么是多态 3.多态在Java中的技术基础 4.示例 5.多态的好处 6.总结 介绍 之前的文章介绍过类的封装性和继承性,现在是时候聊聊面向对象编程的三大特性之一的最后一个类的多态性了。 多态的基础是继承(包括了接口的实现)和方法的覆盖。 什么是多态 多态对应的英文单词是polymorphism ,百度翻译给出的翻译是:n.多型现象,多态性;多机组合形式;

按字面意思就是多种状态、形态、姿态等等,潜台词就是某个东西具有多种状态、形态、姿态等等。 那是什么东西呢?在面向对象的编程语言里面(当然就包括Java 了)就是某个 方法或函数。 那方法的多种状态、形态、姿态有是个什么意思呢?这其实是指同一个方法具有多个方法体,就是方法的实现。而方法的相同与否是由方法签名决定的。 所以,多态其实本质上是指同一个类的同一个方法却具有不同的行为特征。状态、形态、姿态指的就是行为特征。 多态在Java中的技术基础 然而,在Java中,同一个类里面是不可能存在两个签名相同而实现不同的方法 的,否则的话会导致无法判断该执行哪个方法,因此在编译时就会报错。 所以,肯定是在两个类中才有可能存在两个签名相同而实现不同的方法,一个实现在这个类,另一个实现在另一个类。 而如果这两个类毫无瓜葛,那么肯定就与多态的本质(同一个类的同一个方法却具有不同的行为特征)自相矛盾了。 所以,这两个类肯定是有某种联系的。我们再想想,什么概念是能够让两个不同的类却又能称为同一个类的? 答案就是类的继承/扩展,就是现实中的“某东西是某类东西”的概念,就是“具体和抽象”的思想。

继承与多态性习题参考答案

继承与多态性习题参考答案

————————————————————————————————作者:————————————————————————————————日期:

C++程序设计语言习题及实验指导 第8章继承与多态性习题参考答案 8.3 习题 8.3.1 选择题 题号 1 2 3 4 5 6 7 8 9 10 答案 C D A D A B C B D D 题号11 12 13 14 15 16 17 18 19 20 答案 D D A C B C C C A C 8.3.2 填空题 1.(1) a、b、c、x、y、z (2) b、y (3) c、z (4) a、x (5) b、c、x、y、z (6) b、y (7) y (8) b、c、z (9) a、x (10) b、c、x、y、z (11) y (12) y (13) z (14) a、b、c、x (15) b、c、x、y、z (16) y 2.私有 3.抽象 4.虚基 5.(1) 基类(2) 对象 6.(1) 静态(2) 编译(3) 虚函数 7.(1) 2 1 (2) 0 5 8.(1) 100 200 300 30 (2) 10 100 (3) 20 200 9.(1) 5 10 (2) end. (3) 20 10 10.(1) classA classB (2) end. (3) ~classB ~classA 11.(1) 10 (2) build B (3) build C (4) release A 12.(1) class B (2) class C (3) class D (4) 5 13.(1) 5 5 (2) 20 20 14.(1) 10 (2) 10 20 15.(1) 1 (2) 3 (3) 5 (4) 100 10 16.(1) B::f() (2) B::fun() (3) A::f() (4) B::fun() 17.(1) 姓名陈涛年薪6.8万元。(2) 姓名李原(3) 姓名李原月工资4000元18.(1) 110 (2) 2220 19.(1) protected 或public (2) Base1(s1),Base2(s2) 或Base2(s2),Base1(s1) (3) Base1::str (4) test.print() 20.(1) virtual void show()=0 (2) C(int,int,int) (注:参数可有任一名称) (3) b1(y) (4) &t 8.3.3 编程题 1.求长方形的面积和长方体的表面积、体积 #include class Rectangle{ protected: float L; // 长方形的长 float W; // 长方形的宽

实验四 类的继承性与多态性

《Java语言程序设计》实验报告

实验内容 (2)设计两个Graphics类的子类:Rectangle类(矩形)和Circle类(圆),编译并运行使程序运行结果如下所示: 矩形的面积为:100.0 圆的面积为:314.1592653589793 代码: package exp4;//矩形类 public class Rectangle extends Graphics{ protected double a; protected double b; public Rectangle(double a,double b) { super("矩形"); this.a=a; this.b=b; } public double area() { return this.a*this.b; } } package exp4;//圆形类 public class Circle extends Graphics { protected double r; public Circle(double r) { super("圆形"); this.r=r; } public double area() { return Math.PI*this.r*this.r; } } package exp4;//调用上述类 public class Graphics_ex { public static void main(String args[]) { Graphics g = new Rectangle(4,25);

g.print(); g = new Circle(10); g.print(); } } 运行结果: 本次试验运行情况良好。通过本次试验我掌握类的继承原则、重载和覆盖等多态概念设计的正确使用方法、声明抽象类的方法,还理解了抽象类的作用。 实验 分析

类的继承和多态

《3.2 类的继承和多态》 1. 目标概述[2分钟] (2) 2. 回顾[5分钟] (2) 3. 课程知识点讲解 (2) 3.1. 面向对象编程概述[10分钟] (2) 3.2. 类的定义[45分钟] (4) 3.3. 方法[45分钟] (6) 3.4. 属性[35分钟] ......................................................... 错误!未定义书签。 3.5. 索引器[35分钟]...................................................... 错误!未定义书签。 4. 小结[3分钟] (7) 5. 考核点 (8) 6. 作业答案 (8) 7. 扩展练习 (9) 8. 学生问题汇总 (9) 9. 教学后记 (9)

本节目标 ?本节中将讲述如下主要内容: ?C#中继承的基本概念 ?通过虚方法来实现对象的多态性 ?抽象类和抽象方法 ?接口 ?命名空间 ?通过教学使学生掌握C#的类和接口的定义,掌握C#类的继承方法。 本节重点 ?C#中继承的基本概念 ?通过虚方法来实现对象的多态性 ?抽象类和抽象方法 ?接口 ?命名空间 本节难点 ? 授课课时 ?4课时 教法建议 1.目标概述 [2分钟] 本节主要讲述掌握C#的类和接口的定义,C#类的继承方法。 2.回顾 [5分钟] 回顾上一节的相关知识。 3.课程知识点讲解 3.1.继承[80分钟] 引入: 主题: 为了声明一个类是从另一个类继承的,需要使用下面的语法: Class DerivedClass:BaseClass{

C++继承,虚函数与多态性专题

本文作者:黄邦勇帅 学习本文首先你应熟悉C++中的构造函数,基本的类的声明及怎样初始化类,关于这些问题,请参看本人所作的《C++构造函数,复制构造函数和析构函数》一文,在这篇文章中作了详细的介绍。 本文分两部分即继承和虚函数与多态性,本文第一部分详细讲解了继承时的构造函数和析构函数的问题,父类与子类的同名变量和函数问题,最后介绍了多重继承与虚基类。本文第二部分重点介绍了虚函数与多态性的问题,因此学习虚函数的基础是继承,因此在学习虚函数前应学好继承。本文详细易懂,内容全面,是学习C++的不错的资料。 本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正。 声明:禁止抄袭本文,若需要转载本文请注明转载的网址,或者注明转载自“黄邦勇帅”。 主要参考文献: 1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社2005年5月 2、C++.Primer.Plus.第四版.中文版Stanley B.Lippman、Barbara E.Moo著李师贤等译人民邮电出版社2006年3月 3、C++.Primer.Plus.第三版.中文版Stanley B.Lippman等著潘爱民张丽译中国电力出版社2002年5月 4、C++入门经典第三版[美]Ivor Horton著李予敏译清华大学出版社2006年1月 5、C++参考大全第四版[美]Herbert Schidt著周志荣朱德芳于秀山等译电子工业出版社2003年9月 6、21天学通第四版C++ [美]Jesse Liberty著康博创作室译人民邮电出版社2002年3月 14 继承(基类,父类,超类),派生类,子类 一:继承中的访问权限关系。 1.基类,父类,超类是指被继承的类,派生类,子类是指继承于基类的类. 2.在C++中使用:冒号表示继承,如class A:public B;表示派生类A从基类B继承而来 3.派生类包含基类的所有成员,而且还包括自已特有的成员,派生类和派生类对象访问基类中的成员就像访问自已的成员一样,可以直接使用,不需加任何操作符,但派生类仍然无法访问基类中的私有成员. 4.在C++中派生类可以同时从多个基类继承,Java不充许这种多重继承,当继承多个基类时,使用逗号将基类隔开.5.基类访问控制符,class A:public B基类以公有方式被继承,A:private B基类以私有方式被继承,A:protected B基类以受保护方式被继承,如果没有访问控制符则默认为私有继承。 6.protected受保护的访问权限:使用protected保护权限表明这个成员是私有的,但在派生类中可以访问基类中的受保护成员。派生类的对象就不能访问受保护的成员了。 7.如果基类以public公有方式被继承,则基类的所有公有成员都会成为派生类的公有成员.受保护的基类成员成为派生类的受保护成员 7.如果基类以private私有被继承,则基类的所有公有成员都会成为派生类的私有成员.基类的受保护成员成为派生类的私有成员. 8.如果基类以protected受保护方式被继承,那么基类的所有公有和受保护成员都会变成派生类的受保护成员.9.不管基类以何种方式被继承,基类的私有成员,仍然保有其私有性,被派生的子类不能访问基类的私有成员.例:继承中的访问权限关系 class A{int a;protected:int b;public:int c;A(){a=b=c=1;}}; //类B以公有方式从基类A继承 class B:public A {public: int d; B(){//a=2; //错误,不能访问基类中的私有成员 b=2; //正确,可以在类中访问基类中的受保护成员,但类的对象不能访问,基类中的受保护成员b在类B中仍然是受保护成员c=d=2;} };//基类中的公有成员c在类B中仍然是公有成员 //以受保护和私有方式从基类A继承。 class C:protected A{public: int e;C(){//a=3; //错误,不能访问基类中的私有成员 b=c=e=3; }};//这里基类受保护成员b和公有成员c都成为类C中的受保护成员。 class D:private A {public: D(){b=c=4;} };//基类中的公有和受保护成员都成为了类D中的私有成员。 //验证受保护和私有方式继承的访问权限。 class C1:public C {public: C1(){b=c=e=4;} };//正确;类A中的成员b和c在类C中是以受保护方式被继承的,b和c都成为了类C中的受保护成员。 class D1:public D {public:D1(){//b=5; //错误,在A中受保护的成员b在类D中是以私有方式继承的,这样b就成为了类D中的私有成员,所以无法访问。

相关文档