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

[edição não verificada][edição não verificada]
Agora imaginemos que temos um conjunto de bases para uma classe que queiramos derivar, então podemos ter um construtor em cada base que precise de parâmetros para que possa ser invocado pela nossa classe. Como poderemos passar os parâmetros, uma vez que os mesmos só podem ser passados durante a inicialização da classe?
 
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:
 
<source lang="cpp">
class Classe_derivada : public Base1, public Base2, ..., public BaseN
{ // Membros...
public:
Classe_derivada(lista_de_argumentos);
// Outras funções...
};
 
 
Classe_derivada::Classe_derivada(lista_de_argumentos) : Base1(lista_de_argumentos), Base2(lista_de_argumentos), ...BaseN(lista_de_argumentos);
{
int i;
public:
base(int x) { i = x; cout << "ConstructingConstruindo base\n"; }
~base() { cout << "DestructingDestruindo base\n"; }
};
 
class derivedderivada: public base
{
int j;
public:
derivedderivada(int x, int y): base(y) { j = x; cout << "ConstructingConstruindo derivedderivada\n"; }// derivedderivada usesusa x; y isé passedpassada alongem tolista para a base.
~derivedderivada() { cout << "DestructingDestruindo derivedderivada\n"; }
void show() { cout << i << " " << j << "\n"; }
};
int main()
{
derivedderivada ob(3, 4);
ob.show(); // displaysmostra 4 3
#ifdef WIN32
system ("pause");
#endif
return 0;
}
</source>
 
aquiNo exemplo, a o derivedconstrutor constructorda classe derivada é declarado com 2 argumentos (x e y). no entanto a função derivedderivada() 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.
 
aqui vaiVejamos mais um exemplo.
 
<source lang="cpp">
aqui vai mais um exemplo.
#include <iostream>
 
using namespace std;
 
class base1
{
~base1() { cout << "Destructing base1\n"; }
};
 
class base2
{
~base2() { cout << "Destructing base2\n"; }
};
 
class derived: public base1, public base2
{
void show() { cout << i << " " << j << " " << k << "\n"; }
};
 
int main()
{
return 0;
}
</source>
 
== Controlando o acesso ==