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 :

Instanciation d'une classe héritant d'une classe abstraite.


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 4
    Points
    4
    Par défaut Instanciation d'une classe héritant d'une classe abstraite.
    Bonjour à tous,

    Le titre ne présente pas réellement mon problème qui est un peu plus complexe à mes yeux.

    Pour simplifier au maximum, j'ai une classe A, qui à pour fille une classe B (mais qui elle, est abstraite) et elle à également une fille (classe C).



    Donc je voudrais instancier ma classe C, mais pour ça j'ai également besoin de la classe A.

    Note*: Aucune classe n'a de constructeur par défaut.

    J'ai donc pensé à un constructeur de cette forme pour la classe C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    C::C(const A& classeA)
    :   A(classeA),
     
    {
     
    }
    Mais ça ne fonctionne pas, j'ai un message d'erreur qui m'indique que je ne peux pas faire appel au constructeur de classe A car il n'est pas directement parent à C :

    error: 'A' is not a direct base of 'C'

    Du coup je me suis dit que j'allais faire appel au constructeur de A dans B et que j'allais appeler celui de B dans C.

    Mais ça ne pourra pas non plus fonctionner parce que B ne peut pas être instancier (classe abstraite) ...

    Cette ligne ne marche donc pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    B* classeC = new C(B(A(att1,att2,att3..)));
    Je suis un peu perdu, j'imagine que ce problème est assez fréquent, mais je n'ai pas réussi à trouver de solution.

    J'avais trouvé ce site qui en parlait un petit peu, mais je n'ai pas compris la solution non plus (http://www.cplusplus.com/forum/general/48524/)

    Si quelqu'un à une idée je suis preneur.

    Merci d'avance,

    Tranxen

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    85
    Détails du profil
    Informations personnelles :
    Localisation : France, Loiret (Centre)

    Informations forums :
    Inscription : Avril 2010
    Messages : 85
    Points : 61
    Points
    61
    Par défaut
    Salut,

    tu peux peut-etre t'en sortir avec virtual :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <cstdlib>
    #include <iostream>
    #include <string>
     
    class mere{
        public:
           std::string appeller(){return "ok \n";};
    };
     
    class fille : virtual public mere {
        public:
            virtual std::string appeller()=0;
    };
     
    class petite_fille :virtual public fille  {
        public:
            std::string appeller(){return mere::appeller();}; //ou autre chose
    };
     
     
    int main(void){
     
      petite_fille f;
      std::cout << f.appeller() << std::endl;
     
        return EXIT_SUCCESS;
     
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    sans virtual, il suffit de déclarer le constructeur de B protected pour y avoir acces depuis C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
    class A{};
    class B:public A{
      protected:
      B(const A &a):A(a){}  
    };
    class C:public B{
      public:
      C(const A &a):B(a){}
    };
    int main(int argc, char* argv[]){
      A a;
      C c(a);
    }

  4. #4
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par galerien69 Voir le message
    il suffit de déclarer le constructeur de B protected pour y avoir acces depuis C
    Ok, merci beaucoup galerien69, ça fonctionne, je m'étais trompé dans le constructeur de C.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 02/06/2015, 22h50
  2. Réponses: 8
    Dernier message: 05/04/2011, 08h06
  3. Comment récupérer la classe window d'une application wpf depuis une application ext
    Par rsiwpf dans le forum Windows Presentation Foundation
    Réponses: 10
    Dernier message: 14/10/2008, 15h10
  4. Obtenir les classes héritant d'une certaine classe
    Par lyrix dans le forum Langage
    Réponses: 4
    Dernier message: 16/10/2007, 23h43
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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