要点:
1、多种形态,引用的多种形态
对于一个引用变量,可以指向任何类的对象。
对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同。
当通过此引用向对象发送消息,调用的方法是不同的,此时方法的调用就是多态。
2、类与类之间有关系,继承关系
父类的引用可以指向子类的引用或者本类的引用。
父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。
父类的引用指向本类的对象,发送消息,调用本类的方法。
3、编译期类型和运行期类型
*在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。
*在调用方法时,发现确实是子类对象,为子类类型创建空间。
Animal* animal = [[Dog alloc] init];
编译时,把Dog类型当成Animal类型编译。运行时,调用的是Dog类型的对象。
代码分析: A是父类,B继承A,C继承B
A中:
#import <Foundation/Foundation.h> @interface A : NSObject - (void)show; @end
#import "A.h" @implementation A - (void)show { NSLog(@"A show"); } @end
B中:
#import "A.h" @interface B : A - (void)show; @end
#import "B.h" @implementation B - (void)show { NSLog(@"B show"); } @end
C中:
#import "B.h" @interface C : B -(void)show; @end
#import "C.h" @implementation C - (void)show { NSLog(@"C show"); } @end
在main.m中
//A类型的指针 指向A类型的对象 A *a = [[A alloc]init]; [a show]; //多态 //父类指针 指向 子类对象 B *b = [[B alloc]init]; //这里b show 是调用哪个方法呢? [b show]; //动态监测-调用方法时候会监测对象的真实类型 //C也一样 C *c = [[C alloc]init]; [c show];
输出结果:
A show
B show
C show