多态(多种形态)
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)eat;
@end
@implementation Animal
- (void)eat
{
NSLog(@"Animal-吃东西--");
}
@end
@interface Dog : Animal
@end
@implementation Dog
- (void)eat
{
NSLog(@"Dog-吃东西--");
}
@end
int main()
{
Dog *d = [Dog new];
//多态:父类指针指向子类对象
Animal *a = [Dog new];
//调用方法时会检测对象的真实类型
[a eat]
所以下面的写法都是可以的
NSObject *n = [Dog new];
NSObject *n1 = [Animal new];
return 0;
}
多态
1.没有继承就没有多态
2.代码的体现:父类类型的指针指向子类对象
3.好处:如果函数/方法参数中使用的是父类类型可以传入父类、子类对象
4.局限性:父类类型的变量不能直接调用子类特有的方法
//这个函数是专门用来喂狗的
//void feed(Dog *d)
//{
// [d eat]
//}
//
//void feed2(Cat *c)
//{
// [c eat]
//}
//上面两种情况是参数中使用父类Animal类型,可以传入父类.子类对象
void feed(Animal *a)
{
[a eat]
}
int main()
{
Animal *aa = [Animal new];
feed(aa);
Dog *dd = [Dog new];
Cat *cc = [Cat new];
feed(dd);
feed(cc);
Animal *aa = [Dog new];
//结果正确,但是不能这么写 此时aa是指向Dog 但是会被认为是Animal
//[aa run];
//这样是把Animal类型给了Dog类型 是不合理的
Dog *dd = aa
//将aa转为Dog *类型的变量
Dog *dd = (Dog *)aa
return 0;
} |
|