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

Langage C++ Discussion :

Héritage multiple et fonction virtuelle


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut Héritage multiple et fonction virtuelle
    Bonjour,

    Je suis en train d'essayer de faire quelque chose qui ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct A
    {
    	void Foo()
    	{std::cout<<"Foo from IA"<<std::endl;}
    };
     
    struct Base
    {
    	virtual void Foo() = 0;
    };
     
    class Derived : public Base, public A
    {};
    J'aimerais que la class Derived prenne comme implémentation de Foo, celle définie dans A. Y'a t'il un moyen de faire cela. L'idée étant que dans la class Base il soit possible d'appeler Base::Foo() qui "pointerait" vers l'impleme contenue dans A...

  2. #2
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct A
    {
    	void Foo()
    	{std::cout<<"Foo from IA"<<std::endl;}
    };
     
    struct Base
    {
    	virtual void Foo() = 0;
    };
     
    class Derived : public Base, public A
    {
        virtual void Foo() { return A::Foo(); }
    };
    a noter que c'est pas forcément la meilleure idée, cela rend le code confus (si tu as des problèmes pour ecrire ce code, imagine ce que ce sera pour lire ce code?)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Pas faux, j'avais cette solution mais elle ne me plait pas dans le sens ou dans Derived on doit définir Foo, ce que je veux justement éviter :s

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Sinon, hériter de B de manière privée résoudrait peut-être ton problème, mais cela va peut-être en créer d'autres. :-)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 228
    Par défaut
    Citation Envoyé par oodini Voir le message
    Sinon, hériter de B de manière privée résoudrait peut-être ton problème, mais cela va peut-être en créer d'autres. :-)
    Ca n'a pas l'air de solutionner grand chose, je penche de plus en plus vers un problème de design moisi en fait :s Je vais faire autrement histoire que ce soit moins tordu.

    Merci, je passe en résolu même si ça ne l'ai pas vraiment

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 635
    Par défaut
    Salut,

    Déjà, je me pose sérieusement la question de savoir si les deux classes de base ont réellement besoin de la fonction foo...

    Je m'explique:

    Si tu as séparé Base et A, c'est parce que tu estime que la responsabilité de Base est différente de celle de A, et donc, que les services que tu es en droit d'attendre de Base n'ont rien à voir avec ceux que tu es en droit d'attendre de A.

    Par exemple, Base pourrait fournir une fonction draw(), mais pas une fonction move() alors que A fournirait la fonction move() et pas la fonction draw().

    Cela te permettrait de créer :
    • Des classes dérivées susceptible d'être déplacées (car héritant de A) mais incapables d'être tracées,
    • des classes susceptibles d'être tracées (car héritant de Base) mais pas d'être déplacées
    • et, enfin, des classes susceptibles d'être tracées et déplacées car héritante de Base ET de A
    Malheureusement, hors de tout contexte, il est très difficile de se faire une idée précise de la manière de s'y prendre

    De plus, je tiens à rappeler que l'héritage est la relation la plus forte qui puisse exister entre deux classes, et qu'il doit donc être considéré avec une extrême prudence (entre autre en veillant à respecter srcupuleusement le LSP )!!!

    L'héritage multiple, loin de faire exception, nécessite une attention encore beaucoup plus importante
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. Héritage multiple et fonction virtuelle
    Par chronos dans le forum C++/CLI
    Réponses: 0
    Dernier message: 14/02/2012, 09h59
  2. Réponses: 6
    Dernier message: 26/10/2010, 11h33
  3. Réponses: 6
    Dernier message: 12/07/2006, 19h29
  4. Héritage multiple virtuel
    Par Kant2006 dans le forum C++
    Réponses: 19
    Dernier message: 15/06/2006, 14h54
  5. héritages multiples et fonctions abstraites
    Par julien.sagnard dans le forum C++
    Réponses: 4
    Dernier message: 21/10/2005, 14h58

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