web-dev-qa-db-fra.com

Passer le paramètre au constructeur de la classe de base lors de la création d'un objet de classe dérivée

Considérons deux classes A et B

class A
{
public:
    A(int);
    ~A();
};

class B : public A
{
public:
    B(int);
    ~B();
};


int main()
{
    A* aobj;
    B* bobj = new bobj(5);    
}

Maintenant, la classe B hérite de A.

Je veux créer un objet de B. Je suis conscient que la création d'un objet de classe dérivée appellera également le constructeur de la classe de base, mais qu'il s'agit du constructeur par défaut sans aucun paramètre.

Ce que je veux, c'est que B prenne un paramètre (disons 5) et le transmette au constructeur de A. Veuillez montrer du code pour illustrer ce concept.

21
CodeCrusader

Utiliser l'initialisation du membre de base:

class B : public A
{
public:
    B(int a) : A(a)
    {
    }
    ~B();
};
32
Bathsheba
B::B(int x):A(x)
{
    //Body of B constructor
}
12

Si vous utilisez votre constructeur de classe dérivée uniquement pour passer des arguments à la classe de base, vous pouvez également le faire de manière plus courte en C++ 11:

class B : public A
{
    using A::A;
};

Notez que je n'ai même pas utilisé de spécificateur d'accès "public" auparavant. Ceci n'est pas obligatoire car les constructeurs hérités sont implicitement déclarés avec le même niveau d'accès que dans la classe de base.

Pour plus de détails, veuillez vous référer à la section Hériter des constructeurs à: https://fr.cppreference.com/w/cpp/language/using_declaration

Vous pouvez également consulter https://softwareengineering.stackexchange.com/a/307648 pour comprendre les limitations relatives à l'héritage des constructeurs.

3
Mandeep Singh

classe A {public: int aval;

A(int a):aval(a){};
~A();

};

classe B: public A {public: int bval;

B(int a,int b):bval(a),A(b){};
~B();

};

int main(){

  B *bobj = new bobj(5,6);
//or 
  A *aobj=new bobj(5,6); 

}

Dans ce cas, vous affectez les valeurs pour la classe de base et la classe dérivée.

0
Wilson