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 :

Polymorphisme et cast dynamique


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut Polymorphisme et cast dynamique
    Bonjour,
    Lorsque je compile le code suivant avec Visual Studio, j'obtiens le message d'erreur :
    'static_cast' : la conversion de 'FileDataSource *' en 'DataSource *' existe, mais n'est pas accessible.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DataSource* ds;
    if (strcmp(type,"sql") == 0)
    	ds = static_cast<DataSource*>(new SQLDataSource(".\\global.ini"));
    else
    	ds = static_cast<DataSource*>(new FileDataSource(".\\global.ini"));
    FileDataSource et SQLDataSource héritent bien de DataSource!
    Avec un dynamic_cast, ça plante à l'exécution. C'est cohérent mais je ne comprends pas cette notion d'accessibilité.
    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    En l'occurence, tu n'a pas besoin de caster lorsque tu assignes un pointeur vers une classe dérivée à un pointeur de classe de base. C'est dans le sens inverse que le cast a un intéret (pour pouvoir accéder aux propriétés/méthodes non virtuelles)

  3. #3
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Héritage privé ou public ?

  4. #4
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut
    Citation Envoyé par Miles
    Héritage privé ou public ?
    Je ne connaissais pas cette notion d'héritage privé ou public. En effet je n'avais pas précisé! En précisant "public" ça marche. Merci

    Pouvez-vous m'expliquer la notion d'héritage privé car j'ai du mal (ou m'aiguiller vers une ressource) ?

  5. #5
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165

  6. #6
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut
    Merci

  7. #7
    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,

    Pour aller un peu au fond des choses, il faut savoir qu'il n'y a que peu de différence entre une struct et une class, en C++ du moins...

    La principale, c'est ce qu'on appelle "la visibilité" par défaut des membres, méthodes et héritages.

    Le lien fourni par Ksempac explique plus que correctement les trois termes, donc, je vais aller juste un peu plus loin en précisant que, en C++, une classe aura une visibilité par défaut (si tu ne précise pas avant si c'est public, protected ou private) à private, alors que la struct aura une visibilité par défaut à public...

    Un exemple pour comprendre:
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    class A
    {
         //tout ce qui précede le mot clé public est... private, donc accessible
         //seulement au départ d'un objet du type de la classe elle-même
        int machin;
        float brol 
        void truc();
        public: //ce qui suit est... public (accessible de partout)
            A();
            ~A();
            float fonct();
    };
     
    // à contrario, pour la struct, c'est l'inverse
    struct B
    {
        //si rien n'est spécifié, c'est public (donc accessible de partout)
        int machin;
        float brol;
        (...)
        // mais on peut déclarer des choses private (inaccessible en dehors de la
        // struct)
        private:
            float fonct();//inaccessible
    };
    // Assez surprenant, quoi que logique :P : l'héritage...
     
    class C: A //comme rien n'est indiqué, et que A est une classe
               //ca revient à class C: private A,
    {
       (...)
    };
     
    class D: B //comme rien n'est indiqué, et que B est une struct, 
               // ca revient à class D: public B
    {
        (...)
    };
     
    struct E: A//comme rien n'est indiqué, et que A est une classe
               //ca revient à struct E: private A
    {
        (...)
    };
    struct F: B //comme rien n'est indiqué, et que B est une struct, 
                // ca revient à struct F: public B
    {
        (...)
    };
    Pour comprendre l'utilité d'un héritage privé:

    En simplifiant à l'extrème, on peut considérer l'héritage public comme créant une relation de type "est-un";

    Tu as surement déjà entendu parler d'un autre type de relation: la relation "a un/des", qui sort du contexte précis de l'héritage.

    L'héritage privé aurait pour conséquence de créer un troisième type de relation: la relation "tenir un()" (en anglais, tu verra le terme "hold a")

    C'est une relation qui ne trouvera vraissemblablement un intérêt qu'avec la directive using, de manière à rendre certaines méthodes de la classe de base accessibles à la classe dérivée
    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

  8. #8
    Membre habitué
    Inscrit en
    Mars 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mars 2007
    Messages : 10
    Par défaut
    Merci de cette réponse rapide!
    J'aimerais quand même aller un peu plus au fond des choses
    En effet sans aucun cast, le compilateur me gronde de la même façon...
    accessibilité tout ça (d'ailleurs si quelqu'un peut m'expliquer cette notion...)
    C'est d'ailleurs la raison pour laquelle j'ai essayé de caster, car je pensais moi aussi ne pas en avoir besoin...

    Avec un cast C classique (entre parenthèses), j'ai droit à un warning à la compilation(toujours problème d'accessibilité), mais le programme fonctionne correctement. Avec un reinterpret_cast, ça passe sans problème.

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

Discussions similaires

  1. Cast "dynamique" depuis un fichier xml
    Par Arno83 dans le forum Langage
    Réponses: 2
    Dernier message: 26/02/2008, 18h56
  2. [conception]polymorphisme statique ou dynamique ?
    Par vandamme dans le forum C++
    Réponses: 7
    Dernier message: 15/07/2007, 10h14
  3. Casting Dynamique et l'inserer dans jComboBox ?
    Par ExSter dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 13/06/2007, 03h26
  4. Cast dynamique d'un objet ?
    Par elitost dans le forum Langage
    Réponses: 2
    Dernier message: 02/05/2006, 10h43
  5. [DP][héritage]sous-casting dynamique
    Par Le prophete dans le forum Général Java
    Réponses: 4
    Dernier message: 20/08/2004, 11h56

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