¿Cómo puedo inicializar las variables miembro de la clase base en el constructor de clases derivadas?
¿Por qué no puedo hacer esto?
class A
{
public:
int a, b;
};
class B : public A
{
B() : A(), a(0), b(0)
{
}
};
No puedes inicializar a
y b
porque B
no son miembros de B
. Son miembros de A
, por lo tanto solo A
podemos inicializarlos. Puede hacerlos públicos y luego realizar la asignación en B
, pero esa no es una opción recomendada ya que destruiría la encapsulación. En su lugar, cree un constructor para A
permitir B
(o cualquier subclase de A
) inicializarlos:
class A
{
protected:
A(int a, int b) : a(a), b(b) {} // Accessible to derived classes
// Change "protected" to "public" to allow others to instantiate A.
private:
int a, b; // Keep these variables private in A
};
class B : public A
{
public:
B() : A(0, 0) // Calls A's constructor, initializing a and b in A to 0.
{
}
};
Dejando de lado el hecho de que son private
, ya que a
y b
son miembros de A
, deben ser inicializados por A
los constructores de , no por los constructores de alguna otra clase (derivados o no).
Intentar:
class A
{
int a, b;
protected: // or public:
A(int a, int b): a(a), b(b) {}
};
class B : public A
{
B() : A(0, 0) {}
};
De alguna manera, nadie enumeró la forma más sencilla:
class A
{
public:
int a, b;
};
class B : public A
{
B()
{
a = 0;
b = 0;
}
};
No puede acceder a los miembros base en la lista de inicializadores, pero el propio constructor, al igual que cualquier otro método miembro, puede acceder public
a los protected
miembros de la clase base.
# include<stdio.h>
# include<iostream>
# include<conio.h>
using namespace std;
class Base{
public:
Base(int i, float f, double d): i(i), f(f), d(d)
{
}
virtual void Show()=0;
protected:
int i;
float f;
double d;
};
class Derived: public Base{
public:
Derived(int i, float f, double d): Base( i, f, d)
{
}
void Show()
{
cout<< "int i = "<<i<<endl<<"float f = "<<f<<endl <<"double d = "<<d<<endl;
}
};
int main(){
Base * b = new Derived(10, 1.2, 3.89);
b->Show();
return 0;
}
Es un ejemplo práctico en caso de que desee inicializar los miembros de datos de la clase base presentes en el objeto de la clase derivada, mientras que desea enviar estos valores a través de la interfaz mediante una llamada al constructor de la clase derivada.