一.基本概念:
1.多态在代码中的体现,即为多种形态,一定要有继承,没有继承就没有多态。
2.在使用多态时,运行时会进行动态检测,向真实的对象发送信息(方法)
体现:多态在代码中:父类指针 指向 子类对象。
二.例子:
动物类:
#import<Foundation/Foundation.h>
@interface Animal : NSObject
-(void)eat;
@end
#import "Animal.h"
@implementation Animal
-(void)eat{
NSLog(@"动物吃东西");
}
@end
狗类:
#import "Animal.h"
@interface Dog : Animal
-(void)eat;
@end
#import "Dog.h"
@implementation Dog
-(void)eat{
NSLog(@"狗吃东西");
}
@end

二、使用注意
多态的局限性:父类类型的指针变量不能直接调用子类特有的方法。
原因:
1.当使用多态方式调用方法时,编译器首先检查父类中是否有该方法,如果有,运行的时候,确定类型,调用该类型的同名方法;如果父类没有该方法,运行时是无法指向子类的方法的,所以编译直接报错。
2.多态,是程序跑起来才决定是什么类型的.
建议的做法:
Animal *a=[[Dog alloc] init];[a run];//在Animal类中没有run方法,这里调用了狗对象的方法。
解决方法:可以将a强制转换为Dog*类型的变量,如下:
Dog *d=(Dog *)a;//使用强制转换,这里a和d指向的是同一个狗对象
isKindOfClass:确定一个对象是否是该类的实例,或者是该类子类的实例.
三、多态使用总结
(1)没有继承就没有多态
(2)代码的体现:父类类型的指针指向子类对象
(3)好处:如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。
void feed(Animal *a){
//前提父类一定要有这个方法,如果没有报错。
[a eat];
}
(4)局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
编译看左边,运行看右边。