¿Cómo puedo inicializar las variables miembro de la clase base en el constructor de clases derivadas?

Resuelto amrhassan asked hace 13 años • 7 respuestas

¿Por qué no puedo hacer esto?

class A
{
public:
    int a, b;
};

class B : public A
{
    B() : A(), a(0), b(0)
    {
    }

};
amrhassan avatar Sep 14 '11 00:09 amrhassan
Aceptado

No puedes inicializar ay bporque Bno son miembros de B. Son miembros de A, por lo tanto solo Apodemos 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 Apermitir 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.
    {
    } 
};
In silico avatar Sep 13 '2011 17:09 In silico

Dejando de lado el hecho de que son private, ya que ay bson miembros de A, deben ser inicializados por Alos 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) {}
};
NPE avatar Sep 13 '2011 17:09 NPE

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 publica los protectedmiembros de la clase base.

Violet Giraffe avatar Sep 28 '2018 14:09 Violet Giraffe
# 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.

manish srivastava avatar Sep 07 '2017 09:09 manish srivastava