C++的多态性探讨原始1.doc
《C++的多态性探讨原始1.doc》由会员分享,可在线阅读,更多相关《C++的多态性探讨原始1.doc(10页珍藏版)》请在三一文库上搜索。
1、C+的多态性探讨朱 明(湖北大学 数学与计算机科学学院,武汉 430062)摘 要:C+是一种面向对象的程序设计语言,具有封装性,继承性,多态性三大基本特征,多态性是其最重要的特征之一,本文阐述了多态性与联编技术的关系,多态性的实现形式,着重讨论了动态多态性中虚函数的使用,以及虚指针的内部实现机制。关键词:多态性;联编;虚函数;虚指针1引 言在现实世界中,多态性是一种普遍存在的现象。比如,得知学期快要结束,即将放假的消息,学生想到的是要复习好各门功课,然后参加考试;老师想到的是要做好命题,监考,阅卷的工作;教务部门想到的是要及时,合理地制定出考试安排;学工,后勤部门想到的是要做好学生离校的有关
2、工作,等等;C+作为面向对象的程序设计语言,具有很强的描述现实世界的能力,多态性是其三大基本特征(封装、继承、多态性)之一对于多态性存在各种解释:如消息是指对类中成员函数的调用,而多态性指的是同一个消息被不同类型的对象接收时会导致不同的的行为实现;也有将多态性解释为多种形态的;或者,多态性是指一个标识符具有多种状态,而状态指的是该标识符被使用时采用的结合方式或产生的调用,等等。从程序设计最一般的角度考虑,其最基本的任务之一是要解决程序正文中的符号与机器内部存储之间的映射关系,即如何将程序空间的正文符号通过编译或解释映射成为代码空间的存储或操作。传统的面向过程的程序设计语言,如C语言,在处理程序
3、正文标识符与机器代码之间的映射时采用的是一对一的映射。如:int x=1;将程序正文中的标识符x与内存中的一个整型单元联系到一起,并且将初值1存放到该内存单元。在这里,x与其对应的整型单元之间的映射关系是一对一的映射关系。然而,在面向对象的程序设计语言中,如C+,程序正文标识符与机器代码之间一对一的映射关系被突破。一方面,多个程序正文标识符可以映射到同一内存单元或存储区域,形成程序空间到代码空间的多对一映射,引用机制的出现就是一个典型的,最具代表性的例证;另一方面,C+也允许程序空间到代码空间的一对多映射,这就是C+的多态性。为此,C+提供了支持(或实现)多态性的语法机制,它们是:静态联编和动
4、态联编。多态性的实现与联编技术有关。联编也称为绑定(binding),指的是如何将程序正文中一个具有多态性的标识符与代码空间中多个不同实现中的某一个联系起来的过程。根据联编所进行的阶段的不同,可分为静态联编和动态联编。静态联编是指在程序编译阶段进行的联编,这种联编过程是在程序运行之前完成的,又称为早期联编(early binding),其优点是效率高,但灵活性差;动态联编是指在程序运行阶段进行的联编,根据运行时的情况来决定究竟应该映射到哪一个具体实现,又称为滞后联编(late binding),其优点是灵活性强,但效率不高。根据所采用的联编技术的不同,可以将C+的多态性分为静态多态性和动态多态
5、性。2静态多态性静态多态性采用静态联编技术,是指在程序编译阶段就可确定的多态性,又称为编译时的多态性。它有两种实现形式:强制多态和重载多态。2.1强制多态将一种类型的值强制转换成为另一种类型的值称为类型强制。在基本数据类型之间可以通过显式的强制类型转换实现类型强制。如:对于int x;用x=(int)3.14;或x=int (3.14);或x=static_cast(3.14);都可以完成将浮点数3.14转换为整型数3。在使用类类型时也同样存在类似的类型强制,只不过这种类型强制既可以通过显式的方式来完成,也可以隐式地由构造函数来自动转换,甚至可以根据需要在类中定义类型强制转换成员函数来完成指定
6、的类型强制。参见下例:例1#include iostream.hclass A public:A(int x)a=x; couta constructor of class A is called!n; /构造函数用于类型强制operator int()couta operator int() is called!n; return a; /类型转换成员函数用于类型强制private:int a;void f(const A& x)coutfunction f is called!n;void main(void)A obj(1);f(2); /obj=a; /int m=obj; /运行结果
7、如下:1 constructor of class A is called!2 constructor of class A is called!function f is called!97 constructor of class A is called!97 operator int() is called!例1运行后共有5行输出,其中,代码A obj(1);被编译时,系统将自动调用构造函数创建A类对象obj,形成结果中第1行输出;处被编译时,由于在f函数中,形参是A类的引用,实参的类型与形参不一致,系统此时自动调用构造函数将常量2的类型int强制转换成为类类型A,具体过程是在main函
8、数工作区中创建一个A类的匿名对象,并以常量2为初值初始化该匿名对象,然后f函数的形参x引用该匿名对象完成虚实结合,执行f函数的函数体,最后返回mian函数,清除该匿名对象,形成结果中第2,3行输出;类似地,处被编译时,系统也会自动调用构造函数完成由char类型向A类型的类型强制,形成结果中第4行输出;处被编译时,在定义整型变量m并对其初始化时,初值是A类对象obj,因此系统将自动调用operator int()转换函数,将obj的类型由A强制转换成为int,然后再完成赋值操作,形成结果中第5行输出。2.2重载多态 重载实际上是给程序正文中相同作用域内的的同一个标识符赋予不同的操作语义。C+中重
9、载分为函数重载和运算符重载。从本质上讲,运算符重载也就是函数重载。用同一个标识符为多个函数命名称为函数重载,比如,有如下3个max函数:int max(int x,int y); /求2个整数的最大数int max(int x,int y,int z); /求3个整数的最大数int max(int n,int a); /求n个整数的最大数当通过相同的函数名调用被重载的多个函数时,编译器会以调用时的实参类型,个数和次序为依据进行重载解析,因此,不难想象,被重载的多个函数须在形参类型,个数和次序这三个方面不完全相同,否则将会出现二义性,即不能正确地重载解析。例2#include /using na
10、mespace std;class Circle /圆形类public: Circle(double a=0.0, double b=0.0, double r=0.0) x=a, y=b, radius=r; double area( ) return 3.14159*radius*radius; Circle & max(Circle &c) /函数重载,求2个Circle类对象的最大值 return area( )c.area( )? *this : c; friend ostream& operator (ostream&, Circle&); /运算符重载,将流插入运算符重载为该类的
11、友元函数private: double x,y;/圆心坐标 double radius;/半径;ostream& operator(ostream &output, const Circle &c)outputcenter:(c.x,c.y)area=c.area( )endl;return output;void main(void)Circle c1(1, 2, 3),c2(4, 5, 6),c3;c3=c1.max(c2); /coutc3; /运行结果为:center:(4,5) area=113.097,主函数中首先创建了3个Circle类对象c1,c2和c3;处被编译时,通过对象c
12、1调用重载的成员函数max,返回较大值对象c2,然后调用该类的缺省拷贝赋值操作给对象c3赋值;处被编译时,系统调用重载的流插入运算符函数完成对象c3的输出。3动态多态性动态多态性采用动态联编技术,是指在程序运行阶段才能确定的多态性,又称为运行时的多态性。它有两种实现形式:类型参数多态和包含多态。3.1类型参数多态C+是一种强类型语言,参与运算的所有数据的类型在编译时便已确定下来,只有类型匹配才能进行相应的运算,为此,编译器将进行严格的类型检查以确保程序语法的正确性,这样做的好处是显而易见的,保证了类型安全;但与此同时,也带来了一些副作用,增加了程序设计的工作量。例如,有两个求最大值函数,其语义
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 多态性 探讨 原始
链接地址:https://www.31doc.com/p-2725663.html