要点:
1、多种形态,引用的多种形态
对于一个引用变量,可以指向任何类的对象。对于一个父类的引用(类与类之间有一种继承关系),可以指向子类,也可以指向本类,指向的类型不同。当通过此引用向对象发送消息,调用的方法是不同的,此时方法的调用就是多态。 2、类与类之间有关系,继承关系父类的引用可以指向子类的引用或者本类的引用。父类的引用指向子类的对象,发送消息,调用的是子类对象的方法。父类的引用指向本类的对象,发送消息,调用本类的方法。 3、编译期类型和运行期类型*在多态下,父类的引用可以指向子类的引用,当编译的时候,编译器无法确定指向的对象是什么类型,所有编译器会将引用当做父类类型引用编译检查。*在调用方法时,发现确实是子类对象,为子类类型创建空间。Animal* animal = [[Dog alloc] init];
编译时,把Dog类型当成Animal类型编译。运行时,调用的是Dog类型的对象。
代码分析: A是父类,B继承A,C继承B
A中:
#import@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 showB showC show