IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Heritage multiple et constructeurs


Sujet :

C++

  1. #1
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut Heritage multiple et constructeurs
    Bonjour

    supposons les 4 classes suivantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A
    {
    private:
    string n;
    string p;
    int a;
    public:
    A(string, string, int);
    ...
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class B: virtual public A
    {
    private:
    ...
    public:
    B(string nn, string pp, int aa):A(nn, pp, aa){ //autres initialisations 
    //sans passage d'arguments!!
    }
    ..
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class c: virtual public A
    {
    private:
    ...
    float z;
    public:
    C(string nn, string pp, string aa, float zz):A(nn, pp, aa) { //autres //initialisations avec et
    //sans passage d'arguments!!
    }
    ...
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class D: public B, public C
    {
    public:
    D(string nn, string pp, string aa, string zz):
    A(nn, pp, aa),
    B(nn, pp, aa),
    C(nn, pp, aa, zz)
    ....
    };
    bon jusqu'à la rien de méchant

    Mais voici que je lis que
    dans ce cas de figure il est inutile de préciser les informations pour A au niveau des constructeurs B et C..
    ..mais du coup, on déclare comment les constructeurs de B et de C?

    Car si je déclare le constructeur de B de cette sorte:
    B(){...};
    alors je ne pourrais jamais créer d'objet B complet car pour cela j'ai besoin des données que B doit hériter de A

    ... et si je déclare B de cette sorte:
    B(string nn, string pp, int a);

    alors je suis obligé lors de la définition de faire figurer un :A(nn, pp, aa).

    Alors ma question c'est: est ce qu'il est utile ou non de préciser les informations de la class Mère au niveau des constructeurs B et C?

    Si non, alors comment faire pour déclarer / définir les constructeurs de B et de C en sorte qu'on puisse créer des objet B et C pouvant hériter de A .. mais sans pour autant préciser les informations pour A au niveau des constructeurs B et C


  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 14
    Par défaut
    Tout d'abord, il y a des erreurs dans ton code, tu essayes de convertir des chaines en float.

    Ce genre de problème est typique des pièges et subtilité de l'héritage en losange.

    Alors ma question c'est: est ce qu'il est utile ou non de préciser les informations de la class Mère au niveau des constructeurs B et C?
    Pour réponse à ta question : Oui, il est utile que tu précises les informations pour A au niveau de la classe B. C'est même indispensable si tu veux que ça compile

    Si tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B(string nn, string pp, int aa)/*:A(nn, pp, aa)*/ {
    ça ne compile plus.


    Par contre puisque tu fais de l'héritage vituel (public virtual), tu es obligé de préciser dans D les informations pour A. Ce sont ces informations là qui seront utilisés pour construire la classe A.
    En construisant un D, les instructions donnés à la classe A via la classe B ou la classe C ne seront pas utilisés (et heureusement d'ailleurs car le compilateur ne peut pas savoir qui de B ou C a raison si jamais ils veulent écrire des choses différentes dans A).

    Si non, alors comment faire pour déclarer / définir les constructeurs de B et de C en sorte qu'on puisse créer des objet B et C pouvant hériter de A .. mais sans pour autant préciser les informations pour A au niveau des constructeurs B et C
    Si B et C héritent de A, il faut forcément préciser les informations nécessaires pour A.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. constructeur classe fille heritage "multiple"
    Par dharkan dans le forum Débuter
    Réponses: 2
    Dernier message: 31/03/2011, 18h35
  2. constructeur par recopie et heritage multiple C++
    Par ratounette dans le forum C++
    Réponses: 3
    Dernier message: 01/11/2007, 11h54
  3. [POO] Héritage multiple Parent
    Par djshaker dans le forum Langage
    Réponses: 15
    Dernier message: 15/03/2006, 17h35
  4. Réponses: 9
    Dernier message: 25/05/2005, 18h17
  5. [Kylix] heritage multiple et interfaces :(
    Par le_barbu dans le forum EDI
    Réponses: 4
    Dernier message: 26/01/2004, 19h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo