黑马程序员技术交流社区

标题: OC 一个关于id万能指针的问题 [打印本页]

作者: Hi围城    时间: 2014-3-26 20:54
标题: OC 一个关于id万能指针的问题
本帖最后由 Hi围城 于 2014-3-26 23:44 编辑
  1.         id i = [[Person alloc] init];
  2.         NSLog(@"%d", i.age);
  3. // 请问为什么不能正确输出_age的值~
复制代码

作者: FlyTrem    时间: 2014-3-26 21:37
id 是万能指针相当于NSObject *,可以理解了,那么id i = [[Person alloc] init];这句代码相当于用父类指针指向Person子类的对象,为多态。
NSLog(@"%d", i.age);   i.age你没有理解,它不是访问_age变量,而是方法调用,所以这样写是不对的。
可以定义一个变量接受一下
int a = i.age;
NSLog(@"%d",a);
作者: Hi围城    时间: 2014-3-26 23:43
Thank you very much!
作者: 脸皮猴    时间: 2014-3-27 07:45
本帖最后由 脸皮猴 于 2014-3-27 07:47 编辑

楼上给你解答的不错,但是我用法还是不对,
int a = i.age;  // 这句话是会报错的,
在老师将多态的时候,专门说了多态的局限性:
父类类型的对象不能直接调用子类特有的属性和方法!如果实在要调用,就要强制转换为子类类型的变量才可以调用子类特有的方法!!
int a = ((Person *) i ).age;
这样子强制转换后就可以了。到底行不行,你自己测试下·会更加深刻。

作者: cnchenys    时间: 2014-3-27 15:16
父类指针无法调用子类的特有属性和方法,必须强制转换才行哦.
作者: Hi围城    时间: 2014-3-27 16:02
嗯,多态的局限性。
谢谢你们!
作者: Hi围城    时间: 2014-3-27 16:04
脸皮猴 发表于 2014-3-27 07:45
楼上给你解答的不错,但是我用法还是不对,
int a = i.age;  // 这句话是会报错的,
在老师将多态的时候, ...

对,必须强转,谢谢:)




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