voce cria um metodo com o mesmo nome de um outro metodo que foi herdado pela classe, vale o metodo da classe e nao o da superclasse. Logo, voce poderia criar um metodo dentro da classe Gato com o mesmo nome (no caso, getPeso) e com isso apenas o metodo da classe Gato seria afetado, permitindo que a classe Cachorro continuasse retornando o peso em kilogramas. Experimente, realizando overriding de getPeso da classe Gato (nao esqueca de modificar o printf da rotina main para escrever g ao inves de kg).Dentro de classes podemos tambem instanciar objetos. Por exemplo, suponhamos que todos os animais (logo todas as subclasses da classe Animal novamente, nao estamos tentando ser biologicamente corretos!) tenham olhos. Podemos entao, definir uma classe denominada Olho, e instancia-la dentro da classe Animal. Observe a interface e implementacao da classe Olho, bem como os novos arquivos da classe Animal.Olho.h// // Classe Olho - interface // // por Alberto GOK Martins // para o tutorial de Objc //#import <objc/Object.h>@interface Olho : Object{ int estado_da_pupila;}-(void) setEstado_Da_Pupila: (int) pupil;-(void) printEstado_Da_Pupila;@endOlho.m// // Classe Olho - implementacao // // por Alberto GOK Martins // para o tutorial de Objc //#import "Olho.h"@implementation Olho-(void) setEstado_Da_Pupila: (int) pupil{ if(pupil==0) estado_da_pupila=0; if(pupil==1) estado_da_pupila=1; if(pupil==2) estado_da_pupila=2;}-(void) printEstado_Da_Pupila{ if(estado_da_pupila==0) { printf("A pupila esta contraida\n"); } if(estado_da_pupila==1) { printf("A pupila esta normal\n"); } if(estado_da_pupila==2) { printf("A pupila esta dilatada\n"); }}@endAnimal.h// // Classe Abstrata Animal - interface // // por Alberto GOK Martins // para o tutorial de Objc //#import <objc/Object.h>#import "Olho.h"@interface Animal : Object{ double peso; Olho *AOlho;}-(void) setPeso: (double) p;-(double) getPeso;-(void) printEstado_Da_Pupila;-(void) setEstado_Da_Pupila: (int) edp;@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;}-(void) printEstado_Da_Pupila{ // funcao para imprimir o estado da pupila de um animal if(AOlho) [AOlho printEstado_Da_Pupila]; else printf("Nao foi definido um estado da pupila deste animal.\n");}-(void) setEstado_Da_Pupila: (int) edp{ [AOlho free]; AOlho = [[Olho alloc] init]; [AOlho setEstado_Da_Pupila: edp];}@endO codigo que deve ser utilizado para testar o funcionamento do Olho em main.m e:[meuGato setEstado_Da_Pupila: 1];[meuGato printEstado_Da_Pupila];Obtivemos agora um enorme problema. Como e que vamos liberar a memoria alocada para o Olho do Animal? Como nao podemos acessar diretamente o objeto AOlho nao podemos liberar a memoria sem criar um metodo pertencente a classe Animal especifico para isso; ou entao, como saida mais inteligente, realizar um overriding do metodo free.Caso nao liberemos a memoria teremos um problema que se denomina vazamento de memoria, ou memory leakage. Bem, para realizar o overriding de free precisamos saber como liberar a memoria alocada pelo proprio objeto, no entanto como o metodo free e agora diferente do original ele nao mais sabera como liberar a memoria alocada para o objeto. A saida para isso e a instrucao super que se refere a classe pai do recebedor da mensagem. Super chamara nao o metodo da classe atual, mas aquele que foi herdado. Desta forma podemos sempre nos referir ao metodo antigo de todos os metodos que foram implementados atraves de overriding.Logo a implementacao do metodo free para a