User Tools

Site Tools


in204:cpp:syntax:class:deriving:constructor

This is an old revision of the document!


Constructeurs & Classes dérivées

Une classe dérivée :

  • hérite de l'ensemble des champs et fonctions membres de la classe de base,
  • définit des champs et des fonctions membres supplémentaires.

Lors de la création d'un nouvel objet, nous avons deux phases :

  • La première phase consiste à allouer la mémoire. Dans le cas d'une classe dérivée, la mémoire allouée est calculée comme étant la mémoire nécessaire pour le ou les classes de bases ainsi que la mémoire nécessaire à allouer l'ensemble des champs et tables de méthodes nécessaires à la création de la classe de base.
  • La seconde phase consiste à initialiser l'ensemble des champs en effectuant des appels aux constructeurs.

Pouvons nous hériter des constructeurs ?

Les constructeurs définis pour chacune des classes de base ne disposent pas des informations nécessaires pour pouvoir initialiser les champs dans la classe étendue.

  • Appeler le constructeur d'une classe de base ne permet pas de garantir que l'ensemble des extensions définies par la classe qui hérite de la classe de base puisse être correctement initialisé.

Il est donc nécessaire de définir un nouveau constructeur qui va :

  1. initialiser la classe ou les classes de bases en appelant le constructeur. Si aucun constructeur n'est appelé explicitement, c'est le constructeur par défaut de la classe de base qui est appelée 1).
  2. initialiser les champs définis dans la classe dérivée.

Syntaxe

La syntaxe d'un constructeur d'une classe dérivée appelant les constructeurs de la classe de base est la suivante :

 
class Cloth
{
public:
    enum Size { S, M, L, XL, XXL, XXXL }; 
 
private:
    Size m_size;
 
public:
    Size getSize() const { return m_size; }
 
protected:
    Cloth(Size theSize): m_size(theSize)
    {}
    Cloth(const ClothBase& theSource): 
        m_size(theSource.theSize)
    {}
};
 
public class Pant: Cloth
{
private:
    unsigned m_length;
public:
    Pant(Cloth::Size theSize, unsigned theLength):
        Cloth(theSize), m_length(theLength)      
    {}
    Pant(const Pant& anotherPant):
        Cloth(anotherPant), m_lentgh(anotherPant.m_length)
    {}   
};

Le constructeur par défaut

Le constructeur de recopie

1)
Attention, si aucun constructeur par défaut n'est défini pour la classe de base, une erreur de compilation se produira
in204/cpp/syntax/class/deriving/constructor.1569757714.txt.gz · Last modified: 2019/09/29 11:48 by bmonsuez