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 :

Héritage multiple et cast


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Par défaut Héritage multiple et cast
    Bonjour,

    je me trouve face a un problême de compréhension je vous poste un petit code d'exemple pour vous l'exposer :
    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
     
    class a
    {
    public :
    	virtual void abc(void) = 0;
    };
     
    class b
    {
    public :
    	virtual int az(void) {return 4;}
    };
     
    class c : public b, public a
    {
    public :
    	void abc() {}
    };
     
    class d
    {
    	c* var1;
    public :
    	d() {var1 = new c();qWarning() << var1;}
    	a* rt() {return (a*)(var1);}
     
    };
     
    int main(int argc, char *argv[])
    {
    	d* test = new d();
    	qWarning() << test->rt();
    }
    j'ai donc une classe virtuel "a" et une classe "b", la classe "c" dérive de "b" et "a" (dans cette ordre car dans le sens "a" et "b" le problême n'apparait plus).
    La classe "d" encapsule la classe "c" et possède une fonction qui renvoi un pointeur sur la classe a (virtuel) via un cast de la classe c qui est créer dans le constructeur de la classe d via la variable var1.

    Le problème est le suivant quand j'affiche les adresses mémoires des pointeur de la classe "c" (var1) creer dans "d" et le pointeur de la classe "a" renvoyer via le cast de la classe c(var1) dans la fonction rt() ils sont différent !!!!
    Comme je le dit plus haut si je declare la classe "C" de cette facon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     class c : public a, public b // j'inverse l'ordre des classe b et a
    les adresses sont identiques.

    une autre constatation si au lieu de faire un cast (a*)var1 j'utilise un reinterpret_cast le probleme n'apparait pas non plus.

    Quelqu'un pourrait t'il m'expliquer ce phénomène ?

    ps : je compile avec gcc 4.2.3

    Merci d'avance.

  2. #2
    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 le-roy_a Voir le message
    Le problème est le suivant quand j'affiche les adresses mémoires des pointeur de la classe "c" (var1) creer dans "d" et le pointeur de la classe "a" renvoyer via le cast de la classe c(var1) dans la fonction rt() ils sont différent !!!!
    En quoi est-ce un probleme?

    une autre constatation si au lieu de faire un cast (a*)var1 j'utilise un reinterpret_cast le probleme n'apparait pas non plus.
    Mais tu auras un probleme bien plus important: le resultat sera inutilisable.

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Par défaut
    En quoi est-ce un probleme?
    C vrai c pas un problème, je voulais juste comprendre pourquoi j'avais un tel comportement.

    Mais tu auras un probleme bien plus important: le resultat sera inutilisable.
    Effectivement, c inutilisable, mais j'ai compris qu'avec le dynamic_cast j'arrivais à ce que je voulais.
    http://cpp.developpez.com/faq/cpp/?p...S_crosscasting

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    Citation Envoyé par le-roy_a Voir le message
    C vrai c pas un problème, je voulais juste comprendre pourquoi j'avais un tel comportement.
    Probablement parce que l'une des classes (probablement A) a une taille nulle et l'autre pas. Donc tu auras au choix :

    offset B = offset 0 + sizeof(A) = 0 + 0 = 0
    offset A = offset 0 + sizeof(B) = 0 + n = n

    B contient une fonction virtuelle non pure, donc il lui faut probablement un tableau pour faire sa redirection, quand A ne peut jamais être instanciée, donc n'a pas besoin de ressource à son niveau.

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 166
    Par défaut
    ca y ressemble bien car la différence d'offset correspond au sizeof de la classe.

    Merci

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

Discussions similaires

  1. cast et héritage multiple
    Par damiengif dans le forum C++
    Réponses: 16
    Dernier message: 25/01/2014, 23h57
  2. [heritage][conception]héritage multiple en java!
    Par soulhouf dans le forum Langage
    Réponses: 9
    Dernier message: 25/08/2005, 20h03
  3. L'héritage multiple est-il possible en Delphi ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 8
    Dernier message: 30/06/2005, 11h30
  4. utilisez vous l'héritage multiple ?
    Par vodosiossbaas dans le forum C++
    Réponses: 8
    Dernier message: 13/06/2005, 20h25
  5. [XML Schemas]héritage multiple
    Par nicolas_jf dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 10/06/2003, 12h55

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