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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Hi围城 中级黑马   /  2014-3-26 20:54  /  1688 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Hi围城 于 2014-3-26 23:44 编辑
  1.         id i = [[Person alloc] init];
  2.         NSLog(@"%d", i.age);
  3. // 请问为什么不能正确输出_age的值~
复制代码

6 个回复

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

楼上给你解答的不错,但是我用法还是不对,
int a = i.age;  // 这句话是会报错的,
在老师将多态的时候,专门说了多态的局限性:
父类类型的对象不能直接调用子类特有的属性和方法!如果实在要调用,就要强制转换为子类类型的变量才可以调用子类特有的方法!!
int a = ((Person *) i ).age;
这样子强制转换后就可以了。到底行不行,你自己测试下·会更加深刻。
回复 使用道具 举报
父类指针无法调用子类的特有属性和方法,必须强制转换才行哦.
回复 使用道具 举报
嗯,多态的局限性。
谢谢你们!
回复 使用道具 举报
脸皮猴 发表于 2014-3-27 07:45
楼上给你解答的不错,但是我用法还是不对,
int a = i.age;  // 这句话是会报错的,
在老师将多态的时候, ...

对,必须强转,谢谢:)
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马