黑马程序员----多态

------- IOS开发IOS培训、期待与您交流! -------


多态:不同对象对同一消息的不同响应,子类可以重写父类的方法,多态就是允许方法重名,参数或返回值可以是父类型传入或返回。


父类指针指向子类,或者说子类对象动态指向父类的现象叫多态,或者说允许将子类类型的指针赋值给父类类型的指针。

或者通俗理解为:

狗以Dog形态存在,也可以以Animal这种父类形态存在,即多种状态存在。


@interface Animal : NSObject

@end

@interface Dog : Animal

@end


int main()

{

    Dog *d = [Dog new];

    Animal *a = [Dog new];

   //  Dog *d = [Animal new]; 不会报错,但是有警告,不合理(可能Animal有“飞”这个动作,但是狗没有),oc是弱语法,左边怎么写都不报错

}


指针 a 虽然是 Animal 类型存在,但实际上 a 指向的对象是Dog类型,比如 [a eat]; 会首先到 Dog这个类里面找eat这个方法


好处:

1. 如果参数中使用的是父类类型,则父类、子类对象都可以传入,一个父类指针指向多种子类对象。例如Dog类和Cat类都是Animal类的子类,现在有个feed方法,参数类型是Animal类型,Dog类和Cat类都可以调用,狗吃狗粮,猫吃猫粮。


局限性:

父类类型的变量不能用来调用子类的方法。有警告。

例如:Animal *a = [Dog new];  

    [a run];

Animal父类里没有run方法,只有Dog子类里有run方法。


 解决办法:强制转换

Dog *dd = (Dog *)a;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值