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

1 211 bytes adicionados ,  24 de janeiro de 2010
[edição não verificada][edição não verificada]
Assim ficamos com as possíveis combinações
 
----
*Classe base herdada como '''public''':
----
----
**Membros públicos (public) da classe base:
***É como se copiássemos os membros da classe base e os colocássemos como "public" na classe derivada. No final, eles permanecem como públicos.
----
**Membros privados (private) da classe base:
***Os membros estão presentes na classe, porém ocultos como privados. Desta forma as informações estão presentes, mas só podem ser acessadas através de funções publicas ou protegidas da classe base.
----
**Membros protegidos (protected) da classe base:
***Se tivermos membros protegidos (protected) na classe derivada, eles sãose comportam como se tivessem sido copiados para a classe derivada como protegidos (protected).
----
 
<br />
----
*Classe base herdada como '''private''':
----
----
**Membros públicos (public) da classe base:
***Os membros se comportam como se tivessem sido copiados como privados (private) na classe derivada.
----
**Membros privados (private) da classe base:
***Os membros estão presentes na classe, porém ocultos como privados. Desta forma as informações estão presentes, mas não poderão ser acessadosacessadas, a não ser por funções da classe base que se utilizem delas.
----
**Protected membrer da classe base:
**Membros protegidos (protected) da classe base:
***Os membros se comportam como se tivessem sido copiados como privados (private) na classe derivada.
----
<br />
----
*baseClasse classbase inheretherdada ascomo '''Protected''':
----
----
**Membros públicos (public) da clase base:
***Se comportam como se tivéssemos copiado-os como protegidos (protected) na classe derivada
----
**ProtectedMembros membrerprivados (private) da classe base:
***Os membros estão presentes na classe, porém ocultos como privados. Desta forma as informações estão presentes, mas não poderão ser acessadas, a não ser por funções da classe base que se utilizem delas.
----
**Membros protegidos (protected) da classe base:
***AssimSe écomportam como se estivéssemos a copiar copiado-os protectedcomo members da classe base e os colocássemos comoprotegidos (protected ) na classe derivada.
----
 
Em suma, estas regras podem ser sintetizadas em uma regra muito simples: ''Prevalece o atributo mais restritivo''. Para isto basta-nos listar os atributos por ordem de restrições decrescente:
 
#'''''private'''''
*base class inheret as '''Protected''':
#'''''protected'''''
**Public membrer da base classe:
#'''''public'''''
***É como tivéssemos a fazer copy dos public members da classe base e os colocássemos como protected na classe derivada
**Private membrer da base classe:
***não são passados
**Protected membrer da base classe:
***Assim é como estivéssemos a copiar os protected members da classe base e os colocássemos como protected na classe derivada.
 
Assim, temos todas as combinações definidas quando colocamos um atributo combinado com o outro, bastando para isto escolher sempre o mais restritivo na combinação. Por exemplo: Quando temos uma variável pública na base e a herança é privada, a combinação resulta em uma variável privada na classe derivada.
 
aquiAqui está um exemplo muito simples:
 
<source lang="cpp">
 
aqui está um exemplo muito simples
#include <iostream>
 
using namespace std;
 
class base
{
void show() { cout << i << " " << j << "\n"; }
};
 
class derived : public base
{
void showk() { cout << k << "\n"; }
};
 
int main()
{
derived ob(3);
ob.set(1, 2); // accessacesso membera ofmembro da base
ob.show(); // accessacesso membera ofmembro da base
ob.showk(); // usesuso memberde ofmembro derivedda classclasse derivada
#ifdef WIN32
system ("pause");
#endif
return 0;
}
</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:
 
<source lang="cpp">
#include <iostream>
 
using namespace std;
 
class base
{
void show() { cout << i << " " << j << "\n"; }
};
 
class derived : private base
{
void showk() { cout << k << "\n"; }
};
 
int main()
{
derived ob(3);
ob.set(1, 2); // ErrorErro, can'tnão accessé possível acessar set()
ob.show(); // ErrorErro, can'tnão accessé possível acessar show()
ob.showk(); // usesuso memberde ofmembro derivedda classclasse derivada
#ifdef WIN32
system ("pause");
#endif
return 0;
}
</source>
conseguimos aceder á função set() e show() porque é heradada como public
 
Agora já não porque está como private
Agora já não podemos acessar as funções porque estão privadas.
 
== Heranças múltiplas ==