e "dizer sua idade". Desta forma, podemos criar uma classe "ser humano", com essas caracteristicas basicas, e A PARTIR DELA, as duas classes "homem" e "mulher", com as caracteristicas especificas de cada uma.Como os objetos "filhos" herdam todas as caracteristicas do objeto "pai", independentemente do tipo de objeto (ser humano, homem, mulher), a todos eles poderemos mandar a mensagem "dizer nome", e todos responderao corretamente.Isso nos leva a outra caracteristica bastante interessante da orientacao a objetos:POLIMORFISMOSignifica "muitas formas" (daaa...). Permite que um unico nome de classe ou nome de metodo represente um codigo diferente, selecionado por um mecanismo automatico. Trocando em miudos: podemos ter codigos diferentes (que fazem coisas diferentes), mas com o mesmo nome de metodo, em objetos (classes) diferentes. Na hora da execucao, o codigo correto e selecionado pra execucao, a partir do tipo do objeto para o qual se esta enviando a mensagem.Vamos tentar um exemplo "pratico" pra deixar isso mais claro.Imagine o seguinte "codigo-fonte", ficticio, numa linguagem "parecida" com C. Neste codigo, vamos "definir" a classe "Pessoa", e classes filhas dela, "Pessimista", "Otimista", "Timido" e "Extrovertido". Em todas as classes, vamos definir o mesmo metodo, "fale()", so que com codigo diferente em cada uma delas.classe Pessoa{. void fale(). {. printf("Eu sou uma pessoa comum\n");. }}classe Pessimista, filha de Pessoa{. void fale(). {. printf("O copo esta meio vazio...\n");. }}classe Otimista, filha de Pessoa{. void fale(). {. printf("O copo esta meio cheio!\n");. }}classe Timido, filha de Pessoa{. void fale(). {. printf("oi...\n");. }}classe Extrovertido, filha de Pessoa{. void fale(). {. printf("Ola! blabla..! voce sabia que ... bla bla!\n");. }}Como dissemos anteriormente, uma classe e apenas um modelo. Vamos agora criar objetos, a partir das classes definidas acima (obs: qualquer semelhanca com a forma de criar variaveis em C, "tipo nome_variavel;" nao tera sido mera coincidencia... :-) )Pessimista Paulo; /* Paulo e um objeto do tipo "Pessimista" */Otimista Otavio;Timido Tiago;Extrovertido Eduardo;Vamos agora criar um vetor, para armazenar objetos do tipo "Pessoa":Pessoa Galera[4];... ou seja ...Galera[0] vai armazenar um objeto do tipo Pessoa;Galera[1] vai armazenar um objeto do tipo Pessoa;Galera[2] idem...Galera[3] idem...E para fechar o exemplo, vamos fazer:Galera[0] = Paulo;Galera[1] = Otavio;Galera[2] = Tiago;Galera[3] = Eduardo;Oras... dira voce... mas se voce criou um vetor para armazenar "Pessoas", como pode armazenar outra coisa que nao "Pessoas" ? Por exemplo, Galera[0] foi criado para armazenar um objeto do tipo "Pessoa", mas estamos armazenando um objeto do tipo "Pessimista" (Paulo)!!Isto e possivel porque a classe "Pessimista" e derivada da classe "Pessoa", ou seja, de certa forma, um "Pessimista" E uma "Pessoa"! O mesmo acontece com as variaveis armazenadas nos outros elementos do vetor.GTK faz uso extensivo deste recurso, por exemplo, sejam duas classes:GtkWidget: objeto grafico basico, generico;GtkWindow: uma janela (com titulo, botoes de max, min, fechar...)A "widget hierarchy" de GtkWindow e a seguinte:Independente das "classes intermediarias", podemos dizer que um GtkWindow E um GtkWidget.Completando o exemplo... como fazemos para enviar a mensagem "fale()" para cada objeto, ja que sao objetos diferentes, e cada um deveria falar uma coisa diferente?Bem, sem o recurso da heranca, teriamos que ter um monte de IF's aninhados, testando o tipo de