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 privé et opérateur de conversion


Sujet :

Langage C++

  1. #1
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut Héritage privé et opérateur de conversion
    Bonjour à tous (ça faisait longtemps ><) !

    En dehors de tout problème de design, pourquoi :

    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
     
    Class A {};
     
    Class B : A {
    public:
      operator A() { // Mais quelle utilité me direz-vous ??
        return *static_cast<A*>(this);
      }
    };
     
    int main() {
      B b;
      A(b); 
      return 0;
    }
    Me renvoie boulet méchamment en clamant au scandale parce que mon héritage est privé ?
    Honnêtement, ça m'a étonné. Je pensais qu'au pire, il arriverait pas à trouver ce qu'il faut faire... mais là !

    J'ai un peu cherché dans la norme, mais j'ai rien trouvé... Même pas un comportement indéfinie.... :'( !

    Merci de m'éclairer de vos illustres lumières

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

    Informations professionnelles :
    Activité : aucun

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

    Tu semble oublier qu'un héritage privé n'a pas du tout la même sémantique qu'un héritage public.

    L'héritage public est une relation EST-UN, au sens sémantique du terme (une voiture EST-UN véhicule), alors que l'héritage public est une relation "est implémenté en terme de", et se rapproche fortement d'une... agrégation.

    Tu ne peux donc pas te baser sur le moindre raisonnement qui serait valable pour des objets polymorphes
    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

  3. #3
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut


    Je comprend ce que tu dis, mais je vois pas bien en quoi ça répond... En faite, je m'attendais bêtement a ce que le compilateur fasse le cast à l'aide de l'opérateur de conversion... Pas qu'il tente un upcast impossible.

    Aussi, en ce qui concerne la semantique, permet moi de m'auto-cité :

    Citation Envoyé par Lavock Voir le message
    [...] En dehors de tout problème de design, [...]
    PS : si je me plante pas, le seul intêret d'un héritage privé sur une agrégation, c'est qu'il permet l'upcast en interne non ?

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    L'accessibilité ne joue aucun rôle dans la résolution de surcharge et dans l'introduction des conversions implicites, elle détermine juste la validité du choix fait. On détermine donc ici qu'il s'agit d'une base et comme elle n'est pas accessible, c'est une erreur, on ne cherche pas des moyens plus détournés pour rendre l'expression valide.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Assez peu d'intérêt mais :
    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
    class A {};
     
    class B : private A {
    public:
       operator A&() {
          return *this;
       }
     
       operator A const&() const{
          return *this;
       }
       A getA()const
       {
           return *this;
       }
       operator A() const
       {
          return *this;
       }
    };
    void fonction(A&)
    {}
    void cfonction(A const &)
    {}
    void vfonction(A)
    {}
     
    int main() {
       B b;
       A ra = (A&)b;
       A const & rca = (A const&)b;
       A ca = b.getA();
       A ca2 = b.B::operator A();
       //  fonction(b);// erreur
       fonction((A&)b);
       //  cfonction(b);// erreur
       cfonction((A const&)b);
     
       //  vfonction(b);// erreur
       vfonction(b.getA());
     
       return 0;
    }

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    A vrai dire, j'en suis presque à me demander quel peut être réellement l'intérêt d'un héritage privé.

    A part le fait de pouvoir accéder, depuis les fonctions de la classe dérivée, à tout ce qui est publique ou (ou plutôt "et surtout") protégé dans la classe de base sans devoir fournir le membre auquel cela se rapporte (ce qui peut, effectivement, avoir quelques avantages), c'est plutôt limité, non
    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

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par koala01 Voir le message
    A vrai dire, j'en suis presque à me demander quel peut être réellement l'intérêt d'un héritage privé.
    Tu compares à quoi?

    Deux choses qu'il est difficile de faire sans héritage privé:
    - être initialisé avant une base publique (pour pouvoir passer un pointeur vers ce sous-objet au constructeur de la base publique; quand c'est nécessaire, je ne vois pas comment faire autrement)
    - supplanter des membres virtuels (on peut introduire une classe supplémentaire, la rendre friend et avoir des pointeurs croisés...)

    Si tu cherches dans les archives, il me semble qu'on en avait déjà discuté.

  8. #8
    Membre chevronné Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Par défaut
    Effectivement, un cast c-style marche dans se cas... J'hésite souvent à l'utiliser, peur de reinterpret_cast.

    Au passage, je pensais que l'opérateur de conversion s'appelait explicitement par le static_cast. Je me trompe donc ?

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

Discussions similaires

  1. héritage privé et virtuel
    Par Lawyer666 dans le forum C++
    Réponses: 7
    Dernier message: 24/07/2010, 01h34
  2. Template et héritage privé.
    Par 3DArchi dans le forum Langage
    Réponses: 6
    Dernier message: 18/09/2009, 09h36
  3. Opérateur de conversion implicit + dérivation
    Par mister3957 dans le forum C++
    Réponses: 5
    Dernier message: 13/05/2009, 14h50
  4. Opérateur de conversion en dehors d'une classe
    Par kwakanar dans le forum C++
    Réponses: 4
    Dernier message: 08/11/2005, 18h06
  5. [héritage privé] appel du constructeur de base
    Par PINGOUIN_GEANT dans le forum C++
    Réponses: 4
    Dernier message: 19/10/2004, 14h05

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