继承是面向对象的三大特征之一,也是实现软件复用的重要手段。OC的继承具有单继承的特点,每个子类只有一个直接父类。
继承的好处:
1> 抽取重复代码
2> 建立了类之间的关系
3> 子类可以拥有父类中的所有成员变量和方法

#import <Foundation/Foundation.h>

/********************Animal******************/

@interface Animal : NSObject

{
    int _age;
    double _weight;
}
-(void)setAge:(int)age;
-(int)age;

-(void)setWeight:(double)weight;
-(double)weight;

@end

@implementation Animal

-(void)setAge:(int)age
{
    _age = age;
}

-(int)age
{
    return _age;
}

-(void)setWeight:(double)weight
{
    _weight = weight;
}

-(double)weight
{
    return _weight;
}
@end

/***********************Dog*********************/

@interface Dog : Animal

@end

@implementation Dog

@end

/**********************Cat*******************/

@interface Cat : Animal

@end

@implementation Cat

@end

/****************************************/

int main()
{
    Dog *d = [Dog new];
    
    [d setAge:6];
    
    NSLog(@"age=%d",[d age]);
    
    return 0;
    
    
    
    
    
    
    
    
    
}

 2.1    重写父类方法
子类重新实现父类中的某个方法,覆盖父类中的方法叫做重写。子类重写父类的方法需要注意以下几点
1> 父类必须声明在子类的前面
2> 子类不能拥有和父类相同的成员变量
3> 调用某个方法时,优先去当前类中找,如果找不到,去父类中找

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
    int _age;
}

-(void)setAge:(int)age;
-(int)age;

-(void)run;
+(void)test;

@end

@implementation Person

-(void)setAge:(int)age
{
    _age = age;
}

-(int)age
{
    return _age;
}

-(void)run
{
    NSLog(@"personn----跑");
}

+(void)test
{
    NSLog(@"调用了test");
}

@end

@interface Student : Person
{
    int _no;
}

-(void)run;

+(void)test2;

@end

@implementation Student

-(void)run
{
    NSLog(@"student----跑");
}


+(void)test2
{
    [self test];
}

@end

int main()
{
    [Student test2];
    
    Student *stu = [Student new];
    
    [stu run];
    
    
    
    return 0;
    
    
    
}

  

1.继承的使用场合

 1> 当两个类拥有相同属性和方法的时候,就可以将相同的东西抽取到一个父类中

 2> A类完全拥有B类中的部分属性和方法时,可以考虑让B类继承A

#import <Foundation/Foundation.h>

@interface Score : NSObject
{
int _cscore;

int _ocscore;
}

@end

@implementation Score

@end

@interface Student : NSObject
{
    Score *_score; // 学生有个成绩类
    int _age;
}


@end

@implementation Student

@end