一,多态概念:
对象会具有多种形态。多态的条件是继承。
Person *p = [Student new];
p->age = 90;
[p walk];
子类对象赋值给父类指针
父类指针访问对应的属性和方法
父类不能调用子类特有的方法,但可以强转换。
二,用代码来说明一下
#import <Foundation/Foundation.h> //必须包含这个框架,这里面有很多类。
//------Animal------
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal吃东西!!!");
}
@end
//------Dog------
@interface Dog : Animal
@end
@implementation Dog
- (void)eat //重写了父类的eat行为
{
NSLog(@"Dog吃东西!!!");
}
@end
//-----Cat-------
@interface Cat : Animal
@end
@implementation Cat
- (void)eat //重写了父类的eat行为
{
NSLog(@"cat eat eat ");
}
@end
//-----main-------
int main()
{
Animal *c = [Cat new]; // 可以父类指向子类,但注意这里猫不能继承狗
Dog *d = [Dog new];
//多态:狗是一个狗类,另外也是一个种动物类型,SO称为多态
//父类指针指向子类对象。
Animal *a = [Dog new];
[a eat];
//会调用真实类型的方法Dog,而不是调用Animal
//NSObject *e = [Animal new];
//NSObject *f = [Dog new];
NSString *s = [Cat new];
//NSString是系统自带的类
return 0;
}
三,多态的好处
//-----------------------------多态好处1-----------------------------
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal吃东西!!!");
}
@end
//-----Dog-------
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog吃东西!!!");
}
@end
//-------Cat-----
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"cat eat eat ");
}
@end
//------------
// void feed(Dog *d)
// {
// [d eat];
// }
// void feed2(Cat *c)
// {
// [c eat];
// }
//------------
void feed(Animal *c)
//用上面的整合为一句,如果参数写的是父类,子类也可以传进来。
{
[c eat];
}
int main()
{
Animal *dd = [Animal new];
feed(dd);
//调用函数后,会把对象指针dd传给函数形参,多态的好处
Cat *cc = [Cat new];
feed(cc);
return 0;
}
//-----------------------------多态好处2-----------------------------
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal吃东西!!!");
}
@end
//------Dog------
@interface Dog : Animal
- (void)run;
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog吃东西!!!");
}
- (void)run
{
NSLog(@"多态的局限性");
}
@end
//-----Cat-------
@interface Cat : Animal
@end
@implementation Cat
- (void)eat
{
NSLog(@"cat eat eat ");
}
@end
void feed(Animal *c)
{
[c eat];
}
int main()
{
Animal *aa = [Animal new];
//[aa run];
//父类类型的指针变量不能调用子类的方法。
Dog *dd = (Dog *)aa;
[dd run];
//可以强类型转换
// Animal *dd = [Animal new];
// feed(dd);
// Cat *cc = [Cat new];
// feed(cc);
return 0;
}

被折叠的 条评论
为什么被折叠?



