/**
* 多态:多种形态,是对于对象而言的,如果没有继承就没有多态
*
* 在代码中体现:就是通过定义父类指针指向子类的对象
*
* 好处:在函数或者方法的参数中如果传入的是父类指针,那么实现的时候可以传入父类或者子类对象  比如多个子类在完成同一个动作的时候,可以直接将父类指针作为参数传入,那么子类在实现的时候就可以将子类作为参数直接调用方法而完成功能。否则就要为每       一个子类写一个方法,这样就可以省略代码。 局限性:父类类型的指针不能直接访问子类中特别的方法,如果要调用的话必须把父类的指针强制转换成为子 类类型
*
*/ #import <Foundation/Foundation.h> /************* Animal *************/
@interface Animal : NSObject
- (void)eat;
@end @implementation Animal
- (void)eat
{
NSLog(@"动物在吃东西");
}
@end /************* Dog *************/
@interface Dog : Animal
- (void)eat;
@end @implementation Dog
- (void)eat
{
NSLog(@"狗在吃东西");
}
@end /************* Cat *************/
@interface Cat : Animal
- (void)eat;
- (void)catchMouse;
@end @implementation Cat
- (void)eat
{
NSLog(@"猫在吃东西");
}

- (void)catchMouse
{
NSLog(@"猫抓老鼠");
}
@end // "喂"所有的动物 定义函数实现
void feed(Animal *animal)
{
NSLog(@"给一块骨头");
} // main方法
int main()
{
// 对象的第一种形态:以“狗”的形态存在
Dog *dog1 = [Dog new]; /*
对象的第二种形态这种形态:以“动物”的形态存在
就是父类的指针指向子类的对象 定义一个“动物指针”dog2,指向“狗”类的对象的地址
*/ Animal *dog2 = [Dog new]; /*
执行的时候会动态检测对象dog2的真实类型!是父类“Ainimal“呢还是子类”Dog”呢
打印结果是:狗在吃东西
说明dog2这个父类指针,在内存中指的还是子类”Dog“的内存地址,因此执行的是Dog类里面的方法
因此dog2还是”Dog“类型
*/ [dog2 eat]; // 动态检测dog2到底是什么类型 /*
需求:喂”狗“和”猫“吃骨头 体现多态的优点
这样的话:就可以直接通过在函数中定义的父类指针指向所有的子类对象
这样写就可以直接在一个函数中完成”喂“和”狗“和”猫“的需求
*/
Dog *dog3 = [Dog new];
feed(dog3); Cat *cat = [Cat new];
feed(cat); /*
多态的局限性:父类的指针不能直接访问子类特有的方法
*/ Animal *cat1 = [Cat new]; /*
[cat1 catchMouse]; 这样写在xCode中报错,在命令行工具中只是警告可以运行!
cat1虽然是父类的指针,但是它指向的就是Cat类那么应该可以访问到Cat类里面的方法!
但是编译器会认为cat1是Animal类型,会在Animal类中寻找catchMouse方法,找不到结果报错!
*/ // 强制转换指针类型就可以了
Cat *c = (Cat *)cat1; // 首先将父类指针转换成为子类Cat的类型
[c catchMouse]; // 这样编译器认为catchMouse是在子类中,然后寻找到就不报错了! }

最新文章

  1. 【代码笔记】iOS-获得设备型号
  2. HMI与设计模式
  3. 0010《SQL必知必会》笔记06-表的修改与删除
  4. MD5 (摘要加密)
  5. php : 工厂类演示
  6. B - Encoded Love-letter 字符串的处理
  7. Linux驱动设计—— 内外存访问
  8. div左右布局
  9. android124 zhihuibeijing 新闻中心-组图
  10. EasyUI - DataGrid 组建 - [ 新增功能 ]
  11. iOS身份证号码识别
  12. ideal中如何添加几个不同的项目在同一个idea的显示页面
  13. 理解python的元类
  14. 使用阿里云Java SDK 实现 DDNS
  15. 2016vijos 1-3 兔子的晚会(生成函数+倍增FWT)
  16. c++对象模型-对象模型
  17. [日常工作]Oracle12cr2在日常工作中遇到的不兼容的问题
  18. 提取IPv6地址的编码信息
  19. SharePoint Search 分词(WordBreaker)
  20. WordPress前台后台出现一片空白的原因以及解决办法

热门文章

  1. 通过存储过程进行分页查询的SQL示例
  2. 【转贴】gdb中的信号(signal)相关调试技巧
  3. Android 获取手机SIM资料详解
  4. c++简单的ATL COM开发和调用实例(转)
  5. mysql replication inside
  6. 傲娇Android二三事之操蛋的开发日记(第一回)
  7. mysql distinct跟group by性能
  8. jQuery的.bind()、.live()和.delegate(),on之间区别
  9. How to install VXDIAG Honda, Toyota and JLR SDD software
  10. 有(无)符号char型及其溢出问题