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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程序猿-2014 中级黑马   /  2014-4-10 13:46  /  830 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程序猿-2014 于 2014-4-11 14:37 编辑

#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)test1;
@end

@implementation Animal
- (void)test1
{
    NSLog(@"Animal-test1");
}
@end

@interface Dog : Animal
@end

@implementation Dog
- (void)test1
{
    NSLog(@"Dog-test1");
}
@end

int main()
{
    Animal *a = [Dog new];
    [a test1];

    Animal *a2 = [Animal new];
    [a2 test1];

    Dog *a3 = [Dog new];
    [a3 test1];

    return 0;
}
如题    我记得视频中老师不是说父类类型的变量 不能 直接调用子类的方法么       这个我怎么运行时什么问题都没有呢    求大神指教下   谢谢



评分

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

查看全部评分

3 个回复

正序浏览
  1. int main()

  2. {

  3.     Animal *a = [Dog new];

  4.     [a test1];


  5.     Animal *a2 = [Animal new];

  6.     [a2 test1];


  7.     Dog *a3 = [Dog new];

  8.     [a3 test1];


  9.     return 0;

  10. }
复制代码

代码中的:

  1. Animal *a2 = [Animal new];

  2. Dog *a3 = [Dog new];
复制代码

这两行不用解释了吧。各自类的类型的指针指向自己类创建的实例。
而下面一行:
  1. Animal *a = [Dog new];
复制代码

这就是多态的表现,用父类类型的指针指向子类的实例,这是正确的,
在程序执行时,会动态监测所创建的实例的类型,来执行方法的。

评分

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

查看全部评分

回复 使用道具 举报
多态的局限性:父类类型的对象,不能用来直接调用子类特有的方法。必须强转为子类类型的变量后,才能直接调用。
楼主你把代码改成下列格式再理解一下
#import <Foundation/Foundation.h>
@interface Animal : NSObject
- (void)test1;
@end

@implementation Animal
- (void)test1
{
    NSLog(@"Animal-test1");
}
@end

@interface Dog : Animal
- (void)test2;
@end

@implementation Dog
- (void)test2
{
    NSLog(@"Dog-test2");
}
@end

int main()
{
    Animal *a = [Dog new];
    [a test1];
    [a test2];

    Animal *a2 = [Animal new];
    [a2 test1];
    [a2 test2];

    Dog *a3 = [Dog new];
    [a3 test1];
    [a3 test2]

    return 0;
}
回复 使用道具 举报
int main()
{
    Animal *a = [Dog new];
    [a test1];

    Animal *a2 = [Animal new];
    [a2 test1];

    Dog *a3 = [Dog new];
    [a3 test1];

    return 0;
}

首先Animal *a = [Dog new];是一个多态的表现,多态就是用一个父类指针指向子类对象的形式。
[a test1];指的是动物对象调用动物对象中的test方法,所以会执行NSLog(@"Animal-test1");这个代码
Animal *a2 = [Animal new]指的是创建一个动物对象,而执行到[a2 test1]这里的时候就是动物对象调用动物对象的test1方法
Dog *a3 = [Dog new];这个是创建一个Dog对象,[a3 test1];这个是a3调用狗对象中的test1方法
你这里的代码中并没有父类对象调用子类方法,第一个是父类调用的父类的test1方法。所以不会报错。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马