Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
965 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Suivante
Auteur Sujet :

héritage multiple .. pour ou contre ?

n°1724750
jesus_chri​st
votre nouveau dieu
Posté le 25-04-2008 à 22:06:29  profilanswer
 

Reprise du message précédent :
getchar() ou cin.get à la rigueur...
 
mais bon débugger avec des getchar() et des printf()... il y a de très bons debugger gratuits en plus.

mood
Publicité
Posté le 25-04-2008 à 22:06:29  profilanswer
 

n°1724765
in_your_ph​ion
Posté le 25-04-2008 à 23:04:33  profilanswer
 

jesus_christ a écrit :

system("pause" ); <- pas bien, pas portable et si tu veux arréter ton prog à la fin, mets un breakpoint ou passe par un .bat/.sh

 

ici avec un peu de malchance ça va pas cracher car les deux classes sont de taille vide sauf pour le vtable-pointeur. Donc si ça se trouve ça va pas planter et afficher "A says hello".

 

salut,

 

merci pour ta réponse ...

 

ok pour system("pause" ), je mettrai un getchar();

 

par contre quand je compile et execute l'exemple du dessus avec b->print(), j'obtiens :

 


Construction de A
Construction de B
Construction de C
C says hello

 

ca à l'air de marcher  :??:


Message édité par in_your_phion le 25-04-2008 à 23:05:16
n°1724771
IrmatDen
Posté le 25-04-2008 à 23:55:53  profilanswer
 

jesus_christ a écrit :

mais bon débugger avec des getchar() et des printf()... il y a de très bons debugger gratuits en plus.


Ah oui, mais là on parle plus de faire appuyer une touche avant de quitter ;)

n°1724866
jesus_chri​st
votre nouveau dieu
Posté le 26-04-2008 à 11:31:22  profilanswer
 

Code :
  1. class A {
  2. public:
  3. A() { cout  << "construction de A" << endl; }
  4. virtual ~A() { cout << "destruction de A" << endl; }
  5. virtual void print() { cout << "A says hello" << endl; }
  6. private:
  7.     long m_data;
  8. };
  9. class B {
  10. public:
  11. B() { cout  << "construction de B" << endl; }
  12. virtual ~B() { cout << "destruction de B" << endl; }
  13. virtual void print() { cout << "B says hello" << endl; }
  14. private:
  15.     long m_data;
  16. };


 
essaye avec ça : même code mais avec des classes non vides, ça crashera. Pour l'instant ça marche car le seul membre accédé c'est le vtable-ptr, et dans b c'est celui de C, donc ça affiche "C says hello" mais avec des classes non vides, ça va crasher.

n°1725287
in_your_ph​ion
Posté le 27-04-2008 à 22:51:03  profilanswer
 

jesus_christ a écrit :


essaye avec ça : même code mais avec des classes non vides, ça crashera. Pour l'instant ça marche car le seul membre accédé c'est le vtable-ptr, et dans b c'est celui de C, donc ça affiche "C says hello" mais avec des classes non vides, ça va crasher.


 
salut,  
merci pour ta réponse ... j'ai essayé mais ça marche toujours :sweat:  
 
peut être que c'est juste un "hasard" que ça marche ? (du style comportement indéfini qui marche quand même ? )

n°1727975
jesus_chri​st
votre nouveau dieu
Posté le 03-05-2008 à 15:34:34  profilanswer
 

en mettant des membres ça marche ???
comprends pas là...
théoriquement c'est en effet un comportement indéfini, mais je ne vois pas trop ce qu'a généré le compilo pour que ça marche qd même...
t'as bien mis un membre dans chacune des 2 classes ?

n°1839491
frenchtouc​co
Posté le 17-01-2009 à 18:46:39  profilanswer
 

Joel F a écrit :

Encore une fois : j'ai rien contre l'héritage multiple, juste que si je peut m'en passer, je m'en passe. ^^


 
Mais dans quel cas en faite on ne peut pas s'en passer ??

Message cité 1 fois
Message édité par frenchtoucco le 17-01-2009 à 19:00:45

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1839506
frenchtouc​co
Posté le 17-01-2009 à 19:21:27  profilanswer
 

Dans le thinking in C++ volume 2, y a un exemple effectivement où il y est fait allusion  mais l'exemple est un peu ardue à comprendre


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1839608
Taz
bisounours-codeur
Posté le 18-01-2009 à 10:36:30  profilanswer
 

moi je suis contre les marteaux par contre les tournevis, j'adhère.

n°1839673
Un Program​meur
Posté le 18-01-2009 à 15:41:04  profilanswer
 

frenchtoucco a écrit :

Mais dans quel cas en faite on ne peut pas s'en passer ??


 
Strictement, jamais.  On peut toujours simuler à partir de l'héritage simple -- et d'un travail plus ou moins
important.  Après la question est peut-être: quand est-ce qu'il devient préférable d'utiliser une solution à
base d'héritage multiple à une solution à base d'héritage simple?
 
Les réponses vont varier en fonction des goûts et de l'expérience passée des gens. La position de Joël
est assez commune: l'héritage multiple quand toutes les bases sauf une n'ont pas de membres donnée
passe généralement assez bien.   Quand au moins deux bases ont des membres donnée, il y a souvent
une impression qu'il doit y avoir mieux, même si je ne connais personne qui préfère bâtir des constructions
complexes à base d'héritage simple quand ils ont besoin de surcharger dans une même classe des membres
virtuels de deux hiérarchies différentes.  C'est le besoin même qui donne l'impression que la conception est
mal faite ou est trop contrainte -- par exemple parce que les deux hiérarchies proviennent de fournisseurs
différents.  Il faut dire que les cas classiques qui ont besoin de données dans deux classes de bases ont
tendance à être des mixins qui sont mieux exprimés en C++ avec le CRTP ou d'autres techniques à base
de templates.
 
J'aimerais bien une fois pouvoir prendre des hiérarchies comme celles citées dans A Monotonic Superclass
Linearization for Dylan
,  qui a comparé des algorithmes de résolution d'ambiguité (en C++ on aurait une
erreur à la compilation dans ces cas, dans des langages comme Dylan et Common Lisp, non) sur un total
de 3296 classes et 701 cas d'héritage multiple, et voir quelle proportion serait naturellement traitée en
C++ par des techniques à base de template.  À moins que quelqu'un connaisse une référence faisant une
telle analyse (c'est plus difficile à faire que dans le papier cité, qui comparait les résultats d'algorithmes
différents, sans examiner pourquoi on en était arrivé là).

mood
Publicité
Posté le 18-01-2009 à 15:41:04  profilanswer
 

n°1839681
frenchtouc​co
Posté le 18-01-2009 à 16:04:04  profilanswer
 

intéréssant. par contre je vois pas comment les templates peuvent aider à se passer d'un MI, t'aura pas un exmple (code ou idée) pour me mettre sur la piste ?


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1839683
frenchtouc​co
Posté le 18-01-2009 à 16:08:04  profilanswer
 

a oui avec le CRTP ou aures techniques, voir Modern Desing in C++ &co j'imagine


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1839695
Un Program​meur
Posté le 18-01-2009 à 17:11:44  profilanswer
 

frenchtoucco a écrit :

intéréssant. par contre je vois pas comment les templates peuvent aider à se passer d'un MI, t'aura pas un exmple (code ou idée) pour me mettre sur la piste ?


http://www-unix.mcs.anl.gov/worksh [...] osReis.pdf

n°1839991
frenchtouc​co
Posté le 19-01-2009 à 14:27:19  profilanswer
 

Sinon dans "More Exceptional C++" de Sutter y a une partie traitant de la MI c'est assez exhaustif je pense.


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
n°1931248
Lavock
Posté le 12-10-2009 à 15:18:48  profilanswer
 

in_your_phion a écrit :


 
salut,  
merci pour ta réponse ... j'ai essayé mais ça marche toujours :sweat:  
 
peut être que c'est juste un "hasard" que ça marche ? (du style comportement indéfini qui marche quand même ? )


 
Désolé de remonté le poste, je suis tombé dessus par hasard (une recherche avec une des mot clef virtual). C'est uniquement dans un but pédagogique.
 
Si je me plante pas, si ça marche, c'est simplement du au virtual.
Lorsque une classe hérite d'une classe virtuel, elle possède, en plus des pointeur précédemment, l'information révélant sont véritable type (RTTI). D'où le fait que :
- Ca marche
- C'est la méthode de C qui est appelé.
 
Vire les virtual (destructeur compris), et ça devrait planter (je prédit à l'exécution dans ton cas, au linkage dans le cas générique).

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Suivante

Aller à :
Ajouter une réponse
 

Sujets relatifs
[Javascript] héritage entre classe dans des fichiers différentsquestion héritage CSS
petite question sur l'héritage et les castquestion de débutant, casts & héritage
[MySQL] Héritage ?Qui veut un massage contre une base de donnée ?
TListBox à choix multipleMysql - LEFT JOIN Multiple sur une même table
Ce principe est-il efficace contre les bots ?héritage et méthodes virtuelles ?
Plus de sujets relatifs à : héritage multiple .. pour ou contre ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR