最近开始学设计模式,进度有些慢,不知不觉中这个项目拖了好长时间,不过、套用一位网编朋友说过的话,虽然个人感觉这话有些—— ——另类:我不是不奋斗的人,菇娘奋斗起来不是人。O(∩_∩)O哈哈,下面进入正题:
多态!![惊讶](http://static.blog.csdn.net/xheditor/xheditor_emot/default/ohmy.gif)
那么问题来了:什么是多态?好搜百科称之曰:
多态(Polymorphism)按字面的意思就是"多种状态"。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述--多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4 编程技术内幕")。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在Object Pascal和C++中都是通过虚函数(Virtual Function) 实现的。解释的挺清楚的,但是还是有一些细节需要深究一下。
子类重写父类方法,然后用父类的引用指向子类对象,调用方法时进行动态绑定,这就是多态。
最常见的用法就是声明基类的指针,利用指针指向子类对象,调用相应的虚函数(明确:调用基类的虚方法利用指针来执行派生类的具体操作),可以根据指向的子类的不同而实现不同的方法(明确:不同的对象通过自己的代码来执行相同的动作)。如果没有使用虚函数的话,就没有利用C++多态性,则利用基类指针调用相应的函数的时候,将总是被限制在基类函数本身,而无法调用到子类中被重写过的函数。因为没有多态性,函数调用的地址将是一定的,而固定的地址将始终调用到同一个函数,这就无法实现一个接口,多种方法的目的了。多态是为了接口重用:不管传递过来的是哪个类的对象,函数都能够通过同一个接口(利用基类指针)调用到适应各自对象的实现方法。
有一个父类superPerson,它有subCindy,subKindy两个子类
sprClass有一个方法 name(),两个子类都重写了这个方法
那么我们可以定义一个superPersom的引用born,让它指向一个子类的对象,
比如superPerson born = new subCindy();那么我们调用born.name()方法时候,会进行动态绑定
也就是born它的实际类型的name()方法,即subCindy的name()方法。
这个例子也就是书上说的:多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用,也就是说,虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。上面提到了“重写”现在就简要介绍一下:
方法重写
一名方法覆盖
是子类对父类的函数进行重新定义
可用super关键字,引用了当前类的父类
子类函数的访问修饰权限不能少于其父类
如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写
方法重载
让类以统一的方式处理不同类型数据
类中可以创建多个方法,相同的名字,不同的参数和不同的定义。
调用方法时通过传递给他们的不同参数个数和类型绝的具体使用哪个方法
(1)如果子类函数与父类函数同名,但参数不同,不管有无virtual关键字,子类函数将会被隐藏 (注意别与重载混淆)
(2)如子类的函数与父类函数同名,且参数也相同,但是子类没有virtual关键字,子类函数将被隐藏(注意别与覆盖混淆)