黑马程序员技术交流社区
标题: 关于多态的一个问题 [打印本页]
作者: 程序猿-2014 时间: 2014-4-10 13:46
标题: 关于多态的一个问题
本帖最后由 程序猿-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;
}
如题 我记得视频中老师不是说父类类型的变量 不能 直接调用子类的方法么 这个我怎么运行时什么问题都没有呢 求大神指教下 谢谢
作者: 啊康 时间: 2014-4-10 14:02
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方法。所以不会报错。
作者: 董月峰 时间: 2014-4-10 14:43
多态的局限性:父类类型的对象,不能用来直接调用子类特有的方法。必须强转为子类类型的变量后,才能直接调用。
楼主你把代码改成下列格式再理解一下
#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;
}
作者: 王雪冬 时间: 2014-4-10 15:02
- int main()
- {
- Animal *a = [Dog new];
- [a test1];
- Animal *a2 = [Animal new];
- [a2 test1];
- Dog *a3 = [Dog new];
- [a3 test1];
- return 0;
- }
复制代码
代码中的:
- Animal *a2 = [Animal new];
- Dog *a3 = [Dog new];
复制代码
这两行不用解释了吧。各自类的类型的指针指向自己类创建的实例。
而下面一行:
这就是多态的表现,用父类类型的指针指向子类的实例,这是正确的,
在程序执行时,会动态监测所创建的实例的类型,来执行方法的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |