黑马程序员技术交流社区

标题: 多态的一个奇怪问题 [打印本页]

作者: 葬花桥    时间: 2014-5-3 16:19
标题: 多态的一个奇怪问题
本帖最后由 葬花桥 于 2014-5-4 08:20 编辑

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

作者: 兰闻天    时间: 2014-5-3 16:52
老师没说那个不行啊,只是说过父类类型的变量不能用来调用子类的特有方法;
如果Animal里有eat方法, [aa eat];  是完全可以的;
如果Animal里没有eat方法,eat方法是Dog里的特有方法,那么 [aa eat];  就是不行的;
作者: 葬花桥    时间: 2014-5-3 17:32
兰闻天 发表于 2014-5-3 16:52
老师没说那个不行啊,只是说过父类类型的变量不能用来调用子类的特有方法;
如果Animal里有eat方法, [aa e ...

但是,feed函数就可以调用子类重写的方法
作者: 兰闻天    时间: 2014-5-3 18:38
本帖最后由 兰闻天 于 2014-5-3 18:42 编辑
葬花桥 发表于 2014-5-3 17:32
但是,feed函数就可以调用子类重写的方法

是,但前提是父类中也有这个方法不是吗,父类和子类都存在这个方法的话,就是看实际的对象的数据类型,实际是Dog类型的对象,就输出Dog类型的方法

作者: 葬花桥    时间: 2014-5-3 19:35
兰闻天 发表于 2014-5-3 18:38
是,但前提是父类中也有这个方法不是吗,父类和子类都存在这个方法的话,就是看实际的对象的数据类型,实 ...

果然是你说的这样,刚动手实验了下,谢谢解答
作者: 曹雨    时间: 2014-5-3 22:50
兰哥正解我都无法回答了。。父类调用子类,子类不能调用父类,输出看类型。新手菜鸟奋斗中:'(




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2