Constructeur et initialisation

mimo -  
Goblins Messages postés 13 Statut Membre -
j'ai creer une classe sans constructeur, puis une autre qui etend la premiere avec un constructeur pour initialiser les membres herité et ses propre membres sauf que le compilateur me dit que la super classe ne contient pas de constructeur pour l'initialisation. pourquoi?

3 réponses

  1. Goblins Messages postés 13 Statut Membre 1
     
    lorsque que tu utilise un constructeur dans une classe dérivée, celui ou ceux de la classe mère doivent impérativement être implémenté. je ne l'ai jamais vu spécifié sous cette forme mais dans les faits, c'est ce que j'ai toujours remarqué.

    De plus, c'est souvent conseillé dans la littérature.
    0
  2. kij_82 Messages postés 4102 Date d'inscription   Statut Contributeur Dernière intervention   857
     
    Si tu construit une super classe, ou même n'importe quelle classe, il te faut toujours faire un constructeur, car justemnet dans le cas ou il s'agit d'une classe mère ou super classe, tes classes filles devant appellée le constructeur de la classe mère dans leur constructeur elle ne le trouveront pas ce qui te fait ton erreur actuelle.

    eX :
    class Mere {
    
      private int nbEnfant = 0;
    
     Mere ( int nbEnfant  ){
       this.nbEnfant = nbEnfant;
     }
    
     ...
    
    }
    
    class fille extends Mere {
    
      ...
    
      Fille ( int nbEnfant ){
         super(nbEnfant);
    
        ...
    
      }
    
    }
     
    


    Sinon une classe sans constructeur s'appelle une interface. Et dans ce cas là, les interfaces n'ont que les déclarations des fonctions, le corps étant défini dans les classes qui étendent l'interface.
    0
  3. Goblins Messages postés 13 Statut Membre 1
     
    Tout d'abord, Bonjour a tous,

    j'ai une question au sujet des constructeur, dans les classes dérivée...(j'espère sincèrement que vous aurez une réponse...) J'ai une classe mère et une classe qui en hérite et tout ce passe à merveille, à coté de ça, j'ai une autre classe mère et la classe fille qui en hérite et mon constructeur par défaut dans ma classe fille n'est pas accepté par le compilateur, or, j'ai suivi exactelent le même protocle que pour la première.... Le compilateur me dit qu'il y un appel ambigus et qu'il y a définition de plusieurs constructeurs par défaut dans ma classe mère...

    j'en suis déjà à plusieurs heures (voir jour) de recherche et un peux d'aide ne me ferrait pas de mal je pense... C'est probablement une bêtise mais ça bloque...

    Je joint,
    1. les messages d'erreur du compilateur
    2. le code (.h) de mes deux classes.

    1.Erreur compilateur:
    warning C4520: 'CPersonnes' : multiple default constructors specified

    error C2668: 'CPersonnes::CPersonnes' : ambiguous call to overloaded function

    2.Code:
    #ifndef _CPERSONNES_H_
    #define _CPERSONNES_H_

    #define VISUAL

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>

    #ifdef VISUAL
    #include <iostream.h>
    #endif

    const int l_nom=60;
    const int l_pre=60;
    const int l_nai=11;

    #define NUM unsigned int

    class CPersonnes
    {
    friend ostream& operator<<(ostream& s, const CPersonnes& P);

    protected:
    char *nom;
    char *prenom;
    char *naissance;

    public:
    CPersonnes();
    CPersonnes(char *n=0, char *p=0, char *d=0);
    CPersonnes(const CPersonnes& P);
    virtual ~CPersonnes();

    //get set
    char* getNom() const {return nom;}
    char* getPrenom() const {return prenom;}
    char* getNaissance() const {return naissance;}

    void setNom(const char *n);
    void setPrenom(const char *p);
    void setNaissance(const char *d);

    //methode classe
    virtual void affiche() const;
    };

    class CMembrePersonnel:public CPersonnes
    {
    //friend ostream& operator<<()

    private:
    NUM numperso;

    public:
    CMembrePersonnel():CPersonnes()
    {
    setNumperso(0);
    }

    CMembrePersonnel(char *n, char *p, char *d, NUM nu):CPersonnes(n, p, d)
    {
    setNumperso(nu);
    }

    CMembrePersonnel( const CPersonnes& P, const CMembrePersonnel& M): CPersonnes(P)
    {
    setNumperso(M.getNumperso());
    }

    //virtual~CMembrePersonnel(void){;}

    //get set
    getNumperso() const {return numperso;}

    setNumperso(const NUM n){numperso=n;}

    //methode classe
    void affiche() const;

    };

    #endif
    0