Programar em C++/Herança: diferenças entre revisões

m
<source> -> <syntaxhighlight> (phab:T237267)
[edição verificada][revisão pendente]
Sem resumo de edição
m (<source> -> <syntaxhighlight> (phab:T237267))
 
Para declarar uma classe derivada de outra já existente, procedemos de forma a declarar o parentesco e o grau de visibilidade (acesso) que a classe derivada terá dos membros de sua classe base. Para isso seguimos o seguinte código sintático:
 
<sourcesyntaxhighlight lang="cpp">
class classe_derivada : [<acesso>] classe_base {
//corpo da classe derivada
}
</syntaxhighlight>
</source>
 
Repare que temos o operador "''':'''" ( dois pontos ) como elo entre as duas classes. Este operador promove o "parentesco" entre as duas classes quando é usado na declaração de uma classe derivada.
 
Exemplo de implementação:
<sourcesyntaxhighlight lang="cpp">
// Demonstra herança.
#include <iostream>
return 0;
}
</syntaxhighlight>
</source>
 
Na implementação acima temos a classe base veiculo_rodoviario e duas classes derivadas “:” caminhao e automovel.
Aqui está um exemplo muito simples:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
Conseguimos acessar as funções set() e show() porque são heradadas como publicas.
Agora modifiquemos o atributo de acesso na declaração da herança da classe base:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
Agora já não podemos acessar as funções porque estão privadas.
Podemos ter a situação em que uma classe derivada possa herdar membros de várias classes base. Esta característica é uma distinção entre C++ e outras linguagens orientadas a objeto. Este recurso dá mais poder de modelagem ao programador, mas vale a pena lembrar que ''mais poder'' exige ''mais cautela'' no uso.
 
<sourcesyntaxhighlight lang="cpp">
// Um exemplo de múltiplas classes base.
#include <iostream>
return 0;
}
</syntaxhighlight>
</source>
 
Repare que utilizamos o operador vírgula para dizer ao compilador que a classe derivada herda mais de uma classe. Com efeito, temos uma lista de classes separadas por vírgulas depois do operador ":" (dois pontos).
No caso em que termos herança sequencial A-B-C, teremos:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
 
Caso de múltipla herança A - B e C
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
Neste caso a sequência de inicialização segue ordem estabelecida na lista de herança. Mais explicitamente, temos a construção das bases: "base2" e "base1", nesta ordem respectivamente e depois a derivada. O que, automaticamente, nos revela a sequência de destruição na ordem inversa, ou seja: destroi-se a "derivada", depois "base1" e, finalmente, a estrutura da "base2".
Para que possamos passar os parâmetros para as classes bases durante a inicialização do objeto da classe derivada temos o recurso de passagem de parâmetros pelo construtor. Basicamente, ele funciona como se passássemos valores para variáveis membro. Chamamos cada construtor na lista de passagem de valores, a sintax para declarar o corpo do construtor é a seguinte:
 
<sourcesyntaxhighlight lang="cpp">
class Classe_derivada : public Base1, public Base2, ..., public BaseN
{ // Membros...
//Corpo do construtor da classe derivada
}
</syntaxhighlight>
</source>
 
Este exemplo é um pouco mais complexo, atenção!
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
No exemplo, a o construtor da classe derivada é declarado com 2 argumentos (x e y). no entanto a função derivada() usa apenas um para inicializar a variável interna da classe, o segundo argumento é usado para passar o valor de inicialização para a classe base.
Vejamos mais um exemplo:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
== Superposição de funções ==
Vejamos o exemplo de código e teremos uma noção mais concreta do que foi explanado:
 
<sourcesyntaxhighlight lang="cpp">
#include <iostream>
 
return 0;
}
</syntaxhighlight>
</source>
 
Ao executar o programa gerado por este código percebemos que a mesma função: mover(), terá comportamento diferente quando invocada por objetos de classes diferentes. O programa mostrará a mensagem "Nadando..." para a função invocada pelo objeto sardinha e "Voando..." para a invocada pelo objeto passarinho. Aqui, o mecanismo é bem simples de se entender, quando cada objeto tem uma versão diferente para a mesma função é fácil para o compilador relacionar o objeto à classe que ele pertence e invocar a função apropriada.
Ou seja, basta invocar a função informando qual é a versão específica que se deseja utilizar. Se tivermos uma classe "A" e outra "B" com uma função "Print()", por exemplo, e quisermos usar a função "Print()" da classe "B" fazemos:
 
<sourcesyntaxhighlight lang="cpp">
B::Print();
</syntaxhighlight>
</source>
 
Talvez seja melhor visualizar um exemplo no código mais completo:
 
<sourcesyntaxhighlight lang="cpp">
class B
{
return 0;
}
</syntaxhighlight>
</source>
 
== Ver também ==
251

edições