out 312007
 

Blz!

Outro dia na especialização[1], disciplina de Análise e Projeto de Software Orientado a Objetos (Prof. Araújo[2]), o professor mostrou um slide que falava de herança múltipla, e apesar de programar em c++ e já ter utilizado este recurso algumas vezes, surgiram dúvidas que eu não sabia responder e nem tinha idéia do que de fato aconteceria.

Para testar as idéias, modelei o diagrama abaixo na ferramenta BoUML[3]:

A idéia, era basicamente:
Tenho uma superclasse(Veiculo), que possui atributo(cor) e métodos, e uma linha de subclasses(Terrestre e Aquatico), que no caso vão implementar um método abstrato (imprimir) onde tal método consulta o atributo cor e vai dizer qual a cor de fato.
E utilizando o recurso da herança múltipla tenho a classe “Anfibio” que herda de “Terrestre” e “Aquatico” nesta ordem, pelo que vi isso influência na chamada do construtor das superclasses.

Logo abaixo temos o projeto na ide CodeBlocks[4]


Onde abaixo teremos o conteúdo da função main:

1-Neste bloco podemos ver que foi instanciado um objeto da classe “Anfibio”, porém ele será tratado como um objeto da classe “Terrestre”.

std::cout << “Terrestre * anfiTerrestre = new Anfibio();” <<std::endl;
Terrestre * anfiTerrestre = new Anfibio();
anfiTerrestre->imprimir();
delete(anfiTerrestre);

2-Neste bloco podemos ver que foi instanciado um objeto da classe “Anfibio”, porém ele será tratado como um objeto da classe “Aquatico”.

std::cout << “Aquatico * anfiAquatico = new Anfibio();” << std::endl;
Aquatico * anfiAquatico = new Anfibio();
anfiAquatico->imprimir();
delete(anfiAquatico);

3-Neste bloco podemos ver que foi instanciado um objeto da classe “Anfibio”, porém ele será tratado como um objeto da classe “Anfibio”.

std::cout << “Anfibio * anfibio = new Anfibio();” << std::endl;
Anfibio * anfibio = new Anfibio();
anfibio->Terrestre::imprimir();
delete(anfibio);

Como resultado da execução podemos observa a imagem abaixo:

Agora os fatos:

No caso “1”, a classe foi tratada pelo compilador como se houvesse herança apenas da classe “Terrestre”, onde inclusive pegou o valor que foi configurado no construtor da classe “Terrestre”.
No caso “2”, houve o mesmo tratamento do item “1”, porém foi para a classe “Aquatico”.
No caso “3”, parece existir na memoria da classe de forma separada os dois atributos “cor” um da superclasse “Terrestre” e o outro da “Aquatico”, e para que seja compilado deve-se informar em tempo de desenvolvimento qual atributo deve ser referenciado, para isso temos que usar a resolução de escopo, por exemplo:

Terrestre::cor

Quer dizer que quero usar o atributo cor definido no espaço de memória da classe “Terrestre”, o mesmo é válido no caso de métodos, que foi o caso do “imprimir” onde a classe “Anfibio” criou o método “imprimirNovo()”, apenas para validar a idéia, sua implementação pode ser vista abaixo:

void Anfibio::imprimirNovo()
{
std::cout << “\timprimirNovo()” << std::endl;
Aquatico::imprimir();
Terrestre::imprimir();
}

O que posso observar é que se tivermos que trabalhar com herança múltipla de uma mesma familia de classe podemos ter alguns problemas, mas que são facilmente contornados utilizando a resolução global, pelo menos no caso do compilador GCC, ele não permite compilarmos se houver algum problema de resolução, como no seguinte caso:

Anfibio * anfibio = new Anfibio();
anfibio->imprimir();

Qual imprimir deve ser chamado? afinal a classe “Anfibio” não implementou o método imprimir, o qual existe nas suas duas superclasses.

O compilador nos obriga a fazer essa construção, que pode parecer “feia” ou “estranha”, mas resolve o problema 😉

Anfibio * anfibio = new Anfibio();
anfibio->Terrestre::imprimir();

Ou seja, novamente o nosso amigo “::” (operador de resolução) entra em cena para facilitar a vida do compilador e a nossa.
Com isso eu tenho em mente que pode dá trabalho programar com herança múltipla, porém não é esse bicho de sete cabeças que ouvimos dos nossos amigos(que trabalham com linguagens que não suportam este recurso).

Trabalho com Java e já me acostumei com o uso de “Interface”, apesar de achar que algumas vezes um herança múltipla seria de grande ajuda 😉

T+!
Vida Longa e Próspera!

Observação:
Quem se interessar pode entrar em contato que mando os arquivos de projeto (bouml e codeblocks) para compilarem e brincarem a vontade. (Infelizmente não da pra fazer upload pro blog.)

Observação2:
Passei! Valeu pelo apoio dos amigos que me incentivaram a fazer a prova final da disciplina (no lugar do trabalho) 😉
Melhor nota impossível “10”, agora realmente tem nem como fazer o trabalho pra melhorar a média 😉

———————————————-

Referência
[1] http://www.pgcomp.uece.br/index.php?option=com_content&task=section&id=6
[2] http://www.secrel.com.br/araujo
[3] http://bouml.free.fr
[4] http://www.codeblocks.org

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(requerido)

(requerido)