什么是多态性?
多态性还可以分为静态多态性和动态多态性。静态多态是指在类或函数中定义的同名函数。它们根据参数表(类型和数量)区分语义,通过静态绑定实现,例如在一个类中定义不同参数的构造函数。动态多态是指在一个类层次结构的不同类中定义的重载函数,这些重载函数一般具有相同的功能,所以语义要根据指针指向的对象的类来区分,通过动态绑定来实现。
“多态性”一词最早用于生物学,指同一种族的生物具有相同的特征。在面向对象理论中,多态被定义为:相同的操作作用于不同类的实例,会产生不同的执行结果,即不同类的对象接收到相同的消息时,会得到不同的结果。多态性包括编译时多态性和运行时多态性。
动态多态是指当不同类型的对象接收到相同的消息时,可能会导致完全不同的行为。也就是说,一个类的成员函数的行为可以根据调用它的对象的类型自动调整,而不需要用户的任何干预,调整发生在程序运行的时候。多态性是面向对象程序设计的重要特征之一。是继“继承”之后,扩展性的又一重要表现。
例如:
你和你的朋友都是烟民,
有一天,你没有烟,你的朋友有n种烟。
你说,抽根烟,
朋友送你一个;
你穿过香烟的过滤嘴,品尝着白沙香烟的味道。
你想要另一个,
这次是芙蓉王,
再来一杯,
这次是熊猫。
...
以上描述是多态!
烟a =白沙
烟b =芙蓉王
烟c =熊猫
但是发现仅仅通过“smoke”基类并没有对不同的具体类对象的引用。
它允许你调用不同的对象,这就是多态性。
当烟进到嘴里的时候【你还没搞清楚是哪种烟】,仅仅通过“抽”这个动作就能识别出是哪种烟的物体
这就是多态悬浮机。
多态性必须具有:
1.基类和各种子类
2.基类引用,指向实例化的子类对象。
再举一只鸡的例子,
鸡是其他所有鸡的基类,定义了一个方法shape(),可以表示鸡的形状。所有亚纲[火鸡、雉鸡、青蛙等。]有此形法,以表明自己的形。
如果我用下面的方式定义我需要一只特定的鸡,
[基类引用=实现该类的对象]
例如:
鸡a =新火鸡();
鸡a =新蛙();
鸡a =新山鸡();
鸡a =新母鸡();
当我用它的时候,我用引号a,
A.shape(),你会得到一只鸡的形状。
如果我定义的是
鸡a =新火鸡();
然后a.shape得到一个火鸡的形状,没有使用具体的。
火鸡a =新火鸡();然后通过a.shape得到火鸡的形状