174 votes

Comment puis-je initialiser les variables membres de la classe de base dans le constructeur de la classe dérivée ?

Pourquoi je ne peux pas faire ça ?

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

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

};

31voto

NPE Points 169956

Laissant de côté le fait qu'ils sont private , puisque a et b sont membres de A , ils sont censés être initialisés par A 's constructeurs, pas par les constructeurs d'une autre classe (dérivé ou non).

Essayer:

 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) {}
};

19voto

Violet Giraffe Points 5764

D'une manière ou d'une autre, personne n'a énuméré le moyen le plus simple :

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

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

};

Vous ne pouvez pas accéder aux membres de base dans la liste d'initialisation, mais le constructeur lui-même, comme toute autre méthode membre, peut accéder aux membres public et protected de la classe de base.

3voto

# 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;
}

C'est un exemple pratique au cas où vous voudriez initialiser les membres de données de la classe de base présents dans l'objet de la classe dérivée, alors que vous souhaitez pousser ces valeurs en s'interfaçant via l'appel du constructeur de la classe dérivée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X