|
|
|
|
|
|
|
|
|
|
|
不同的对象收到同一消息可以产生完全不同的结果,这一现象叫做多态。在使用多态的时候,用户可以发送一个通用的消息,而实现的细节则由接收对象自行决定,这样,把具有通用功能的消息存放在高层次,而把不同的实现这一功能的行为放在较低层次,在这些低层次上生成的对象能够给通用消息以不同的响应。
|
|
|
多态有几种布控的形式,Cardelli和Wegner把它分为四类,即
|
|
|
|
其中,参数多态和包含多态称为通用的多态,过载多态和强制多态称为特定的多态。包含多态在许多语言中都存在,最常见的例子就是子类型化,即一个类型是另一个类型的子类型。过载多态是同一个变量被用来表示不同功能而通过上下文以决定一个名字所代表的功能。
|
|
|
|
|
|
|
|
|
|
|
|
|
多态性(Polymorphism)同继承性一样,是面向对象程序设计的标志性特征,是一个考查重点。
|
|
|
多态性是考虑在不同层次的类中以及在同一类中,同名的成员函数之间的关系问题。函数的重载和运算符的重载都属于多态性中的编译时的多态性。运行时的多态性是以虚基类为基础的多态性。
|
|
|
|
多态是指同样的消息被不同类型的对象接受时导致不同的行为(不同的实现或调用了不同的函数)。所谓消息,是由"类::方法"(功能)和"方法的实参"(消息数据)共同组成的。
|
|
|
产生多态性的原因是:不同的对象在处理同样的消息时,使用的方法实现(成员函数的函数体)不同。"多态性"是与"类的派生和继承"联系在一起的,是基类中所定义方法的"多态性"。对于在派生类中新增加的方法,是没有多态性的。
|
|
|
|
|
(2)强制多态:强制类型转换。把一个变量的类型变换成另一种类型,以符合一个函数或者操作的要求。例如,加法运算符在执行浮点数和整数的相加时,首先把整数转换成浮点数,然后再相加。
|
|
|
(3)包含多态:主要通过虚函数来实现。强调不同类中的同名成员函数的多态行为。
|
|
|
|
|
|
|
|
|
|
|
|
|
所谓多态,是指通过基类对象调用一个基类和派生类都有的方法时,在运行时才能确定到底调用的是基类的方法还是派生类的方法。多态的好处是增加了程序的可扩展性。多态是通过动态联编实现的,即编译时不确定,程序运行时才确定调用哪个函数。
|
|
|
|
|
|
|
|
|
|
|
|
|
在C++语言中,所谓多态性,即对同一条信息,不同对象将产生不同的相应操作。简言之,以多种形式在多个对象上进行操作(但接口相同)。多态性一般通过对象的继承关系来实现。
|
|
|
在讲多态性实现之前,首先讨论一下成员函数重载和虚函数的概念。
|
|
|
成员函数的重载是指在派生类中定义和其祖先类中相同的函数,即函数名、参数个数、参数类型都相同。虽然函数的重载一定程度上满足了多态性,但是函数重载实现多态性的前提是知道接收消息的具体对象。这不能满足在现实世界中,消息发送者在发送消息之前,并不需要知道具体接收者的要求。函数的重载只是静态地满足了多态性的要求。重载的子程序是一种特别的多态。
|
|
|
虚函数是在类的成员函数定义前面加上关键字virtual。虚函数仅给出方法的定义而不给出方法体。含有虚函数的类叫作抽象类。抽象类具有如下特性:①由于抽象方法没有体,因此抽象类不能实例化;②抽象类的子类必须给出所继承的抽象方法的体。
|
|
|
在C++语言中,多态是通过虚函数来实现的。如果一个基类的成员函数定义为虚函数,那么,它在所有派生类中也保持为虚函数,派生类中可以省略virtual关键字。要达到多态的效果,基类和派生类的对应函数不仅名字相同,而且返回类型、参数个数和类型也必须相同。在C++语言中,不允许用抽象类创造对象,它只能被其他类继承。要定义抽象类,就必须定义纯虚函数,它实际上是起到接口的作用。对虚函数的限制是:只有类的成员函数才可以是虚函数;静态成员函数不能是虚函数;构造函数不能是虚函数;析构函数可以是虚函数,而且我们常常将析构函数定义为虚函数。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|