necessario criar um classe para cachorros. Bem, poderiamos criar uma subclasse de Object denominada Cachorro e implementar funcoes como setPeso e getPeso identicas as da classe Gato. Uma solucao melhor, seria criar uma subclasse de Object denominada Animal, e as classes Cachorro e Gato seriam subclasses da classe Animal, que por sua vez seria uma classe abstrata, visto que nunca iremos criar uma instancia de Animal.No exemplo abaixo fizemos justamente isso.Animal.h// // Classe Abstrata Animal - interface // // por Alberto GOK Martins // para o tutorial de Objc //#import <objc/Object.h>@interface Animal : Object{ double peso;}-(void) setPeso: (double) p;-(double) getPeso;@endAnimal.m// // Classe Abstrata Animal - implementacao // // por Alberto GOK Martins // para o tutorial de Objc //#import "Animal.h"@implementation Animal-(void) setPeso: (double) p{ peso=p;}-(double) getPeso{ return peso;}@endGato.h// // Classe Gato - interface // // por Alberto GOK Martins // para o tutorial de Objc //#import "Animal.h"// aqui comeca a definicao das interfaces@interface Gato: Animal-(void) miau;@endGato.m// // Classe Gato - implementacao // // por Alberto GOK Martins // para o tutorial de Objc //#import "Gato.h"#import <stdio.h>// aqui comecam as implementacoes dos metodos@implementation Gato-(void) miau{ printf("Miaau!\n");}@endCachorro.h// // Classe Cachorro - interface // // por Alberto GOK Martins // para o tutorial de Objc //#import "Animal.h"// aqui comeca a definicao das interfaces@interface Cachorro: Animal-(void) auau;@endCachorro.m// // Classe Cachorro - implementacao // // por Alberto GOK Martins // para o tutorial de Objc //#import "Cachorro.h"#import <stdio.h>// aqui comecam as implementacoes dos metodos@implementation Cachorro-(void) auau{ printf("AuAu!\n");}@endmain.m// // Programa de Animais com heranca // // por Alberto GOK Martins // para o tutorial de ObjC //#import <stdio.h>#import "Gato.h"#import "Cachorro.h"// aqui comeca o programaint main( int argc, const char *argv[] ){ Gato *meuGato = [[Gato alloc] init]; Gato *meuGato2 = [[Gato alloc] init]; Cachorro *meuCachorro = [[Cachorro alloc] init]; Cachorro *meuCachorro2 = [[Cachorro alloc] init]; [meuGato setPeso: 4.2]; [meuGato2 setPeso: 4.9]; [meuGato miau]; [meuGato2 miau]; printf("meuGato pesa: %lf kg\n",[meuGato getPeso]); printf("meuGato2 pesa: %lf kg\n",[meuGato2 getPeso]); [meuCachorro setPeso: 10.2]; [meuCachorro2 setPeso: 13.3]; [meuCachorro auau]; [meuCachorro2 auau]; printf("meuCachorro pesa: %lf kg\n",[meuCachorro getPeso]); printf("meuCachorro2 pesa: %lf kg\n",[meuCachorro2 getPeso]); [meuCachorro free]; [meuCachorro2 free]; [meuGato free]; [meuGato2 free]; return 0;}Observe que no exemplo acima o metodo reproduzir nao existe mais. Optamos por nao escreve-lo, pois embora essa seja uma atividade comum para todos os animais a reproducao de animais diferentes deve gerar objetos de classes diferentes, e nao um animal generico da classe animal. Para contornar o problema voce poderia escrever dois metodos, um para cada classe, denominados reproduzir, que embora partilhassem o mesmo nome seriam um pouco diferentes; afinal voce nao espera que um casal de cachorros gerem filhos gatos. Implementar um metodo comum exigira um pouco mais de conhecimento, e isso sera realizado na proxima secao, denominada Polimorfismo, Typing dinamico e Binding dinamico.Suponha agora que voce queira que o metodo getPeso para um gato retorne o peso em gramas e nao em quilos. Bem, voce pode modificar a implementacao original de getPeso na clase Animal, porem isso modificara tambem o retorno do getPeso para cachorros. Para solucionar este problema pode-se utilizar um conceito denominado overriding.Overriding e simplesmente sobrescrever um metodo. Quando