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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

//没有继承就没有多态
//代码的体现:父类类型的指针指向子类的对象
//好处:如果函数\方法参数中使用的是父类类型,可以传入父类,子类对象
//局限性:父类类型的变量 不能 直接调用子类特有的方法。必须强制转为子类类型后,才能直接调用子类特有的方法
#import<Foundation/Foundation.h>
@interface Animal :NSObject
-(void)eat;
@end

@implementation Animal
-(void)eat
{
NSLog(@"动物-吃东西");

}
@end



@intface Dog : Animal


@end

@implementation Dog
//重写:一般直接在类的实现中直接定义,不需要再声明,因为父类已经有声明
-(void)eat
{

NSLog(@"Dog-吃东西");
}


@end
//注意:参数填写父类的指针,让父类的指针接收接收子类的对象Animal *a = dd或者CC (在多态中以后会常见)
//如果参数中使用的是父类类型,可以传入父类,子类对象。
void feed(Anamal *a)
{

  [a eat];

}



int main()
{

Dog *dd = [Dog new];
Cat *cc = [Cat new];
feed(dd);
feed(cc);
   

Animal *a = [Animal new];



//多种形态
多态:父类指针指向子类对象
Animal *a = [Dog new];

//调用方法时会检测对象的真实形象-由于上面的真实对象是Dog,所以父类指针指向的对象调用eat,会在Dog对象方法里面找,而不是去调用父类的eat方法。

//多态中的局限性:父类类型的变量 不能 用来调用子类的方法,
//  [a eat]; //会出现警告,但是可以运行,解决方式(强制类型转换)  将a转为Dog * 类型的变量

Dog *q = (Dog *)a;将强制转换类型后的变量赋值给变量q;

然后:[q eat]  //这个时候就不会出现警告了





0 个回复

您需要登录后才可以回帖 登录 | 加入黑马