cada objeto, e ai chamando a funcao correta: "se for pessimista, fala isso... senao, se for otimista, fala aquilo... senao... ".Com o recurso da heranca, e do polimorfismo, essa tarefa fica MUITO mais facil: for ( CONT=0 ; CONT<4 ; CONT++ ){Galera[CONT].fale();}Passo-a-passo:inicializa CONT com 0;CONT e menor que 4? SIM! entra no laco.chama o metodo "fale()" na variavel Galera[0]agora e que esta o "pulo do gato": Galera[0] e do tipo Pessoa, mas nela esta armazenado um objeto do tipo "Pessimista", logo, AUTOMATICAMENTE, vai ser chamado o metodo "fale()" da classe Pessimista, e nao o da classe Pessoa!!!fim do laco: CONT fica igual a 1, ainda menor que 4, entra no laco novamentechama o metodo "fale()" na variavel Galera[1]o objeto armazenado em Galera[1] e "Otavio", do tipo "Otimista", entao automaticamente vai ser chamada a funcao "fale()" da classe "Otimista"fim do laco: CONT fica igual a 2, entra no laco novamentee por ai vai...Assim, a saida que teremos, sera:O copo esta meio vazioO copo esta meio cheiooi...Ola !! bla bla bla !! ...Mais um exemplinho... seja uma funcao qualquer, que receba como PARAMETRO um objeto do tipo "Pessoa", e retorne um inteiro com a idade dessa pessoa. A funcao seria escrita assim (na nossa "pseudo" linguagem C... ): int Diz_Idade ( Pessoa FulanoDeTal );{......}A seguinte chamada dessa funcao e valida:...Diz_Idade( Paulo );...Deixando claro: a funcao espera receber um parametro do tipo "Pessoa". Estamos passando o objeto "Paulo", que e do tipo "Pessimista". Nenhum problema ai, ja que "Pessimista" E uma "Pessoa" (pela definicao de heranca!). As chamadas abaixo tambem sao validas:Diz_Idade( Otavio );Diz_Idade( Tiago );Diz_Idade( Eduardo );Pra fechar esse post-monstro, um exemplinho com GTK, pra ir tomando o gosto...MAS ATENCAO!! O exemplo esta INCOMPLETO e SIMPLIFICADO!!1: int main( ... )2: {3: GtkWidget *window;4: 5: ...6: 7: window = gtk_window_new ( ... );8: 9: gtk_window_set_title ( window, "Hello World!!" );10: 11: ...12: }Vamos ver passo a passo?linha 3: estamos criando uma variavel de nome "window", que e do tipo "ponteiro" para o tipo de dados GtkWidget (como ja vimos, o tipo de dado basico de todos os objetos em GTK);linha 7: utilizamos a funcao "gtk_window_new" que cria toda a definicao necessaria para uma janela grafica na memoria do computador. Esta funcao retorna o endereco inicial desta definicao (analogia: comando malloc, cria uma area na memoria, e devolve o endereco inicial da area). Armazenamos este endereco na variavel "window".linha 9: utilizamos a funcao "gtk_window_set_title" para definir o texto que sera exibido como titulo da janela. Passamos como parametros, obviamente, a variavel que tem o endereco da janela cujo titulo queremos definir (neste exemplo, variavel "window"), e o texto que queremos como titulo (a string "Hello World!").Aqui podemos ver a heranca em acao: a funcao gtk_window_set_title espera receber de parametro um objeto do tipo GtkWindow. Mas, o que passamos foi a variavel "window", que e um GtkWidget. Ora, como ja vimos no exemplo anterior, e tambem na hierarquia da classe GtkWindow, uma GtkWindow E um GtkWidget. Logo podemos passar a variavel "window" para esta funcao sem problemas.Repetindo: este exemplo esta SIMPLIFICADO e INCOMPLETO. Foi so pra ilustrar