A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葬花桥 中级黑马   /  2014-5-3 16:19  /  1929 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 葬花桥 于 2014-5-4 08:20 编辑

多态就是父类指针在没有显式转换的情形下指向子类对象,Animal * aa = [dog new];
李明杰都是讲多态的时候讲到了一个函数,
void feed(Animal *a)
{
        [a eat];
}
这时可以把aa传给feed函数,feed(aa);就调用了吃方法。
但是直接 [aa eat];  
老师却说不行,这和函数的没什么本质区别啊?
C++中有虚函数,这样完全没问题,OC虽然语法简单但是语法模棱两可的情形太多了

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

5 个回复

倒序浏览
老师没说那个不行啊,只是说过父类类型的变量不能用来调用子类的特有方法;
如果Animal里有eat方法, [aa eat];  是完全可以的;
如果Animal里没有eat方法,eat方法是Dog里的特有方法,那么 [aa eat];  就是不行的;

评分

参与人数 1技术分 +1 收起 理由
jing迪 + 1

查看全部评分

回复 使用道具 举报
兰闻天 发表于 2014-5-3 16:52
老师没说那个不行啊,只是说过父类类型的变量不能用来调用子类的特有方法;
如果Animal里有eat方法, [aa e ...

但是,feed函数就可以调用子类重写的方法
回复 使用道具 举报
本帖最后由 兰闻天 于 2014-5-3 18:42 编辑
葬花桥 发表于 2014-5-3 17:32
但是,feed函数就可以调用子类重写的方法

是,但前提是父类中也有这个方法不是吗,父类和子类都存在这个方法的话,就是看实际的对象的数据类型,实际是Dog类型的对象,就输出Dog类型的方法
回复 使用道具 举报 1 0
兰闻天 发表于 2014-5-3 18:38
是,但前提是父类中也有这个方法不是吗,父类和子类都存在这个方法的话,就是看实际的对象的数据类型,实 ...

果然是你说的这样,刚动手实验了下,谢谢解答
回复 使用道具 举报
兰哥正解我都无法回答了。。父类调用子类,子类不能调用父类,输出看类型。新手菜鸟奋斗中:'(
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马