论述C与C在继承性和多态性上的异同_第1页
论述C与C在继承性和多态性上的异同_第2页
论述C与C在继承性和多态性上的异同_第3页
论述C与C在继承性和多态性上的异同_第4页
论述C与C在继承性和多态性上的异同_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、论述c#与c+在继承性和多态性上的异同c+语言是一种同时支持面向过程程序设计和面向对彖程序设计的混合型高级程序设计 语言。c+支持封装性、继承性和多态性。c#是从c和c+语言演化而来的,它在语句、表 达式和运算符方面沿用了许多c+的功能,同时也有着相当大的改进和创新。为了提高软件 模块的可复用性和可扩充性,以便提高软件的开发效率,我们总是希望能够利用前人或自己 以前的开发成果,同时又希望在自己的开发过程中能够有足够的灵活性,不拘泥于复用的模 块。c#这种完全面向对彖的程序设计语言提供了两个重要的特性一继承性和多态性。一、继承性:继承是面向对彖程序设计的主要特征之一,它可以让您重用代码,可以节省

2、程序设计的 时i'可。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基 类的特征和能力,而且可以加入新的特性或者是修改己有的特性建立起类的新层次。我们从c#的派生和c+的派生类的定义格式和例子来分析。(1) c#:访问修饰符class类名:基类名类的成员;;例子:using system;public class person/这是一个基类/定义数据成员publ ic string name;/姓名public char sex;/性别定义构造函数,以初始化字段public person (string name, char sex)name = name;s

3、ex = sex;/定义方法成员public string answer()return string. format (,z姓名:0,性别:1° "、name, sex);pub 1 ic class student : person/这是一个派生类/扩展数据成员public string school;/学校private int score;/成绩定义构造函数,自动调用基类的构造函数辅助完成字段的初始化publie student(string name, char sex, string school, int score):base(name, sex)schoo

4、l = school;score = score;/扩展方法成员public float examine()/返回考试成绩return score;class testclassstatic void main()/创建student对象student s = new student (/z张伟",男',"电子科大成都学院",480); console. writ eline ("该生信息如下:");console. writeline(s. answer () ;/调用对象继承来的方法console. writeline (z,学校:

5、0,考试成绩:1, s. school, s. examine (); (2) c+:class 派生类名:继承方式基类名1,继承方式基类名2,、'、'继承方式 基类名3派生类新增的数据成员和成员函数定义;例子:typedef char string8080;class datepub1ic:dateo date(int y, int m, int d) setdate(y, m, d) ; void setdate(int y, int m, int d)year = y;month = m;day = d;vold getstringdate(string80 &d

6、ate)sprintf(date, "%d/%d/%d", year, month, day);protected:int year, month, day;class timepub1ic:timeo time(int h, int m, int s) settime(h, m, s) ; void settime(int h, int m, int s)hours = h;minutes = m;seconds = s;void getstringtime(string80 &time)sprintf(time, d:%d:%ct, hours, minutes

7、, seconds);protected:int hours, minutes, seconds;;class timedate:public date, public timepublic:timedate () : date () time(h,seconds);timedate(int y, int mo, int d, int h, int mi, int s) :date(y, mo, d), mi, s) void getstringdt(stringbo &dtstr)sprintf(dtstr, "%d/%d/%d;%d:%d:%d", year,

8、month, day, hours, minutes,;void main ()timedate datel, date2(199& & 12, 12, 45, 10);string80 demostr;datel. setdate(1998, 8, 7); datel. settime(10, 30, 45);datel. getstringdt(demostr); cout«/,the cout«,zthe cout<<z,the cout<<,thedatel datel datel date2datedate time dat

9、eand time is: datel. getstringdate(demostr); i s: /z< datel. getstringtime (demostr);is: z/< date2. getstringdt (demostr);and time is:"< 首先,我们比较c+源代码中的第c行和c#源代码中的第c行。我们可以看到在c+中 的继承是分为:公有继承,私有继承,保护继承。而在c#屮只有默认的公有继承。这样简 化了继承的方式,至于限制派生类访问基类的数据以及方法成员,将由基类的数据以及方法 成员的访问控制权限决定。(1) c#中,派生类只能从一

10、个类中继承。这是因为,在c+中,人们在大多数情况下不 需要一个从多个类中派生的类。从多个基类中派生一个类,往往会带来许多问题,从而抵消 了这种灵活性带来的优势。c#中的继承符合下列规则:继承是可传递的。如果c从b中派生, b又从a中派生,那么c不仅继承了 b中声明的成员,同样也继承了 a中的成员。object类 作为所有类的基类。(2) 派生类应当是对基类的扩展。派生类可以添加新的成员,但不能除去已经继承的成 员的定义。构造函数和析构函数不能被继承。除此以外的其它成员,不论对它们定义了怎样 的访问方式,都能被继承。基类中成员的访问方式只能决定派生类能否访问它们。(3) 派生类如果定义了与继承而

11、来的成员同名的新成员,就可以覆盖己继承的成员。但 这并不因为这派生类删除了这些成员,只是不能再访问这些成员。类可以定义虚方法、虚属 性以及虚索引指示器,它的派生类能够重载这些成员,从而使得类可以展示出多态性。(4) c#屮,派生类只能从一个类中继承,但可以通过接口实现多重继承。在c#屮可以通过base关键字来访问基类成员,具体的访问规则如下:(1) 调用基类上已被其他方法重写的方法。(2) 指定创建派生类实例时应调用的基类构造函数。(3) 基类访问只能在构造函数、实例方法或实例属性访问器中进行。(4) 从静态方法中使用base关键字是错误的。我们能看出来两者不同之处,(1)c#中,派生类只能从

12、一个类中继承,但c+中有单一 继承,多重继承和多极继承。(2) c#的默认继承方式是public,而c+的默认继承方式是 private c+可以从多个基类中继承下来,每个基类都要设定继承方式。两者的相同之处(1)派生类从它们的直接基类中继承成员:方法、域、属性、事件、 索引指示器。(2)私有成员,构造函数和析构函数都不能被继承。(3)派生类应当是对基类 的扩展。派生类可以添加新的成员,但不能除去已经继承的成员的定义。(4)运行时,派生 类对构造函数和析构函数的顺序一样。(3)派生类中的构造函数都用base来引用基函数构 造函数来给基函数的成员赋初值。c#屮在属性的重载屮,提出了密封属性。用s

13、ealed修饰符声明的属性为密封属性。类 的密封属性不允许在派生类中被继承。密封属性的访问器同样也是密封的。c#和c+在访问 派生类与基类同名成员时,有所不同,因为c#每一个派生类只有一个基类,访问基类成员 时通过base关键字访问。c卄的继承有多种方式,可能有一个基类,也可能有几个基类, 所以访问基类的成员时,通过:基类名:成员名,來达到访问目的。二、多态性:在面向对象的系统屮,多态性是一个非常重要的概念,它允许客户对一个对象进行操作, 由对象來完成一系列的动作,具体实现哪个动作,如何实现由系统负责解释。多态性的定义是:同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后 产生不同的

14、执行结果。c#和c+均支持两种类型的多态性:编译时多态性和运行时多态性。 前者是在编译的过程中确定了同名操作的具体操作对象,而后者则是程序运行过程中动态地 确定操作所针对的具体对象。这种确定具体对象的过程就是联编。联编是指计算机程序自身 彼此关联的过程,也就是把一个标识符名和一个存储地址联系在一起的过程:用面向对象的 术语讲,就是把一条消息和一个对象的方法相结合的过程。按照联编进行的阶段的不同,可 以分为两种不同的联编方法:静态联编和动态联编,这两种联编过程分别对应着多态的两种 实现方式。()分析c+与c#中重载多态性:在c+和c#编译器都有自己的一些算法用于重新解析。为了进行重新解析,幣数以

15、它的 签名来表示,签名就是函数名加上它的参数列表(参数的数量以及每个参数的类型)。但两 者的同之处在于:c+中是允许把高级转化为低级,例如long转换为int类型进行函数调 用的。但是在c#中是不允许把double转换为int类型的。即c#中不允许进行收缩转换,因 为有可能会使内存产生溢出。如果非要转换的话,就必须使用类型强制转换符。(二) 分析c+与c#中运算符重载多态性:运算符重载是对已经有的运算符赋予多重含义,使同一个运算符作用于不同的类型的数 据导致不同类型的行为。运算符重载实质就是函数重载。在实现过程屮,首先把指定的运算 表达式转换为对运算符函数的调用,运算对象转化为运算符函数的实参

16、,然后根据实参的类 型来确定需要调用的函数,这个过程是在编译过程屮完成的。c+的运算符重载的规则如下:(1) c+屮运算符除了类属关系运算符成员指针运算符“*”、作用域分辨符号 sizeof运算符和三目运算符“?”不能被重载,其他的都可以重载,但只能重载c+中已有 的运算符。(2) 重载之后运算符的优先级和结合性都不会改变。(3) 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造。一般來 讲,重载的功能应当与原有的功能相类似,不能改变原运算符的操作对象个数,同时至少要 有一个操作对彖是自定义类型。c#中的操作符重载的作用与c+是一致的,但是c#中的操作符重载也有其自己的特点。

17、如下所示:(1) c#中,操作符重载总是在类中进行声明,并且通过调用类的成员方法来实现。操作 符重载声明的格式为:type operator operator-name (formal-param-1 ist)(2) c#中不能被重载的操作符:二、&&、| | > ?:、new、typeof> sizeof、is其他的都 可以重载,但只能重载c#中已有的运算符。两者唯-不同之处在于c#中的运算符重载函数必须是静态的。(三) c+与c#中强制多态性分析:数据类型的转换就是,将存储在变量中的数值由一种类型转换成另外一种类型。在c+ 中,数据类型转换可以是隐式的,也可以是

18、显式的:float t = 100. 1;long j = i;/隐式转换int k = (int)i;/显式转换int m=int (i) ;/显式转换,新c+风格c+中,有两种显式的数据类型转换格式一一旧的c风格,其中数据类型名放在括号内。 新风格,其中变量名放在括号内。在c#中,显式转换数据类型总是用旧的c风格语法,不 能用c+新的风格。c#的类型安全性耍比c+要高,所以它的数据间的转换不灵活。c#的显 式转换和隐式转换都是止式的转换。定义为隐式的转换可以用显式或隐式两种转换来执行。 而对定义为显式转换的数据转换使用隐式转换会出现错误。这点与c+不同,c+只会出现 警告。(四) c+与c

19、#中包含多态性分析:包含多态性是指通过继承提供多态性。包含多态性反映了能够在多于一个类的对象中完 成同一事物的能力一一用同一种方法在不同的类中处理不同的对象。包含多态性是运行时多 态。c#和c+都通过继承来为我们提供包含多态性。它们均提供了 virtual关键字用于定义 一个支持多态的方法。子类对于虚拟方法可以自由地提供它自己的实现,这称为重写。下面 是一些关于c#虚拟方法的要点:(1) 如果方法是非虚拟的,编译器简单地使用所引用的类型来调用适当的方法。(2) 如果方法是虚拟的,编译器将产生代码来在运行时检查所引用的类,来从适当的类 型中调用适当的方法。(3) 当一个虚拟方法被调用时,运行时会

20、进行检查(方法迟绑定)来确定对象和调用适 当的方法,所有这些都是在运行时进行的。对于非虚拟方法,这些信息在编译期间都是无效的,因此不会引起运行时检查,所以调 用非虚拟方法的效率会略微高一些。但在很多时候虚拟方法的行为会更有用,损失的那些性 能所换来的功能是很值得的。在c+和c#中包含多态性是很类似的,他们均是通过虚函数来 实现的。通过下面的代码来分析它们间的异同。c#中可以用两种方法来实现类成员的多态性:一是使用new关键字重新定义类的成员, 看一例子:pub 1ic class pesrsonpublic string id;public string name;public string

21、answer()return string. format ("工作证号:0,姓名:1。” , id, name);public class student : personreturn string. format ( a学号:0,姓名:1。” , id, name);c#和c+均提供了 virtual关键字用于定义一个支持多态的方法。 我们直接看两个例子再来分析:c#:using system;namespace duotai3using system ;public classdrawingbasegeneric drawing object.,z)circle. “)squa

22、re. “)public virtual void draw()con sole. writeline(/zipublic class line : drawingbasepublic override void draw()con sole. writelinec'i 'm public class circle : drawingbasepublic override void draw()console. writeline(,tpublic class square : drawingbasepublic override void draw()console. wri

23、teline("tm just aa line);public static void main(string args)draw in gbase dobj = newdrawingbase 4;dobj0 = new line() dobjl = new circle()dobj2 = new square()dobj3二new drawingbase()dobj)foreach (drawingbase drawobj indrawobj. draw();程序运行结果:taline !i'macircle!i'masquare!i'mjust a generic drawing object!c+:#include<iostream>using namespace std;class drawingbasepublic:virtual void draw()cout<<,zi "m just a gen eric draw ing object! z/<<e nd

温馨提示

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

评论

0/150

提交评论