要點: 1、多種形態,引用的多種形態對於一個引用變數,可以指向任何類的對象。對於一個父類的引用(類與類之間有一種繼承關係),可以指向子類,也可以指向本類,指向的類型不同。當通過此引用向對象發送消息,調用的方法是不同的,此時方法的調用就是多態。 2、類與類之間有關係,繼承關係父類的引用可以指向子類的引 ...
要點:
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