//没有继承就没有多态
//代码的体现:父类类型的指针指向子类的对象
//好处:如果函数\方法参数中使用的是父类类型,可以传入父类,子类对象
//局限性:父类类型的变量 不能 直接调用子类特有的方法。必须强制转为子类类型后,才能直接调用子类特有的方法
#import<Foundation/Foundation.h>
@interface Animal :NSObject
-(void)eat;
@end
@implementation Animal
-(void)eat
{
NSLog(@"动物-吃东西");
}
@end
@intface Dog : Animal
@end
@implementation Dog
//重写:一般直接在类的实现中直接定义,不需要再声明,因为父类已经有声明
-(void)eat
{
NSLog(@"Dog-吃东西");
}
@end
//注意:参数填写父类的指针,让父类的指针接收接收子类的对象Animal *a = dd或者CC (在多态中以后会常见)
//如果参数中使用的是父类类型,可以传入父类,子类对象。
void feed(Anamal *a)
{
[d eat];
}
int main()
{
Dog *dd = [Dog new];
Cat *cc = [Cat new];
feed(dd);
feed(cc);
Animal *aa = [Animal new];
//多种形态
多态:父类指针指向子类对象
Animal *a = [Dog new];
//调用方法时会检测对象的真实形象-由于上面的真实对象是Dog,所以父类指针指向的对象调用eat,会在Dog对象方法里面找,而不是去调用父类的eat方法。
//多态中的局限性:父类类型的变量 不能 用来调用子类的方法,
// [a eat]; //会出现警告,但是可以运行,解决方式(强制类型转换) 将a转为Dog * 类型的变量
Dog *q = (Dog *)a;将强制转换类型后的变量赋值给变量q;
然后:[q eat] //这个时候就不会出现警告了
} |
|