多態
1.沒有繼承就沒有多態2.代碼的體現:父類類型的指針指向子類對象
3.好處:如果函數\方法參數中使用的是父類類型,可以傳入父類、子類對象
4.侷限性:
1> 父類類型的變量 不能 直接調用子類特有的方法。必須強轉爲子類類型變量後,才能直接調用子類特有的方法
#import <Foundation/Foundation.h>
// 動物
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-吃東西----");
}
@end
// 狗
@interface Dog : Animal
- (void)run;
@end
@implementation Dog
- (void)run
{
NSLog(@"Dog---跑起來");
}
- (void)eat
{
NSLog(@"Dog-吃東西----");
}
@end
// 貓
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"Cat-吃東西----");
}
@end
// 這個函數是專門用來喂動畫
//void feed(Dog *d)
//{
// [d eat];
//}
//
//void feed2(Cat *c)
//{
// [c eat];
//}
//
// 如果參數中使用的是父類類型,可以傳入父類、子類對象
void feed(Animal *a)
{
[a eat];
}
int main()
{
// NSString *d = [Cat new];
// [d eat];
/*
Animal *aa = [Dog new];
// 多態的侷限性:父類類型的變量 不能 用來調用子類的方法
//[aa run];
// 將aa轉爲Dog *類型的變量
Dog *dd = (Dog *)aa;
[dd run];
*/
//Dog *d = [Dog new];
//[d run];
/*
Animal *aa = [Animal new];
feed(aa);
Dog *dd = [Dog new];
feed(dd);
Cat *cc = [Cat new];
feed(cc);
*/
/*
// NSString *s = [Cat new];
Animal *c = [Cat new];
NSObject *n = [Dog new];
NSObject *n2 = [Animal new];
// 多種形態
//Dog *d = [Dog new]; // Dog類型
// 多態:父類指針指向子類對象
Animal *a = [Dog new];
// 調用方法時會檢測對象的真實形象
[a eat];
*/
return 0;
}