Bonjour,
Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients
merci
Nicolas
Bonjour,
Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients
merci
Nicolas
Bonjour,
Un exemple concret et simple. Omnivore: c'est un carnivore et un herbivore.
"Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
"Less is more" Ludwig Mies Van Der Rohe
Risk & Security Mgmt
Tu peux donner des détails quand à ce qu'est un Carnivore/Herbivore ?
En général, on peut toujours éviter l'héritage multiple de classe non virtuelle pure.
L'héritage privé peut résoudre des problèmes quand à la manière d'allouer la mémoire (on peut éviter de passer par des new et des delete sur un attribut en faisant un héritage privé de celui ci)... mais bon.Je voudrais savoir quel est réellement l'intérêt de l'héritage multiple en c++ ? (je demande pas forcément d'exemples concrets, mais grosso modo, dans quel cas il est utile) car j'y vois surtout beaucoup d'inconvénients
Faire un héritage multiple publique de plusieurs classes non virtuel pur, je trouve qu'en général, c'est pas le bon plan.
Je ne répondrai à aucune question technique en privé
Des espèces qui mangent de la viande et des espèces qui mangent des végétaux Dans le cadre d'un jeu par exemple, ça a un sens.
Après, bien évidemment, tu peux coder une liste avec les régimes alimentaires ... mais bon. C'est sympa aussi de pouvoir hériter du régime alimentaires des deux
"Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
"Less is more" Ludwig Mies Van Der Rohe
Risk & Security Mgmt
Oui, mais comment fais-tu cela ?
Moi, je vois un truc du genre :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 interface Mangeur { bool accepterManger(); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Carnivore : Mangeur { bool accepterManger(manger) { si(manger==VIANDE) == true retourner true sinon retourne false; } }Tu fais comment ton héritage ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Vegetarien : Mangeur { bool accepterManger(manger) { si(manger==vegetal || manger==oeuf...) == true retourner true sinon retourne false; } }
Parce que par définition de l'omnivore (omni voulant dire tout), je vois surtout :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class Omnivore : Mangeur { bool accepterManger(manger) { retourner true; } }
Je ne répondrai à aucune question technique en privé
Bonsoir,
En java, l'héritage multiple n'est pas possible mais on utilise des interfaces à des fins similaires.
Mais, au delà de ca, les designs patterns offrent une solution à ce genre de problème. Il suffit d'avoir une classe qui reprends le comportement au niveau des habitudes alimentaires et d'avoir une référence dans la classe animal. C'est dans le même ordre d'idée que la représentation d'un état.
Développeur en devenir.
A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.
Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.
"On en apprends beaucoup plus par la confrontation que par la conciliation"
En fait je pensais plutôt à un truc du genre
Code : Sélectionner tout - Visualiser dans une fenêtre à part si bestiole^est-un(Carnivore) alors { cours-forest-cours } fin-si
"Voyager, c'est découvrir que tout le monde a tort", Aldous Huxley
"Less is more" Ludwig Mies Van Der Rohe
Risk & Security Mgmt
L'approche état/behaviour (voir headfirst design patterns). Ma mémoire est floue mais je pense qu'il s'agit de la délégation.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83 public abstract class HabitudesAlimentaires { public bool accepterManger(manger) { } } public class Carnivore extends HabitudesAlimentaires { public Carnivore() { } public bool accepterManger(manger) { if( manger==VIANDE ) return true else return false; } } public class Vegetarien extends HabitudesAlimentaires { public Vegetarien() { } public bool accepterManger(manger) { if(manger==vegetal || manger==oeuf) == true return true else return false; } } public class Omnivore extends HabitudesAlimentaires { public Carnivore() { } public bool accepterManger(manger) { if( manger==VIANDE && ( manger==vegetal || manger==oeuf ) ) return true else return false; } } public class Animal { private HabitudesAlimentaires ha = null; public Animal() { } public void accepterManger() { ha.accepterManger(); } public void setHab( HabitudesAlimentaires instanceHab ) { this.ha = instanceHab; } public HabitudesAlimentaires void getHab() { return ha; } } public class Test { public static void main(String[] args) { Animal unAnimal; HabitudesAlimentaires ha; bool testManger; unAnimal = new Animal(); ha = new Carnivore(); unAnimal.setHab( ha ); testManger = unAnimal.getHab().accepterManger( "VIANDE" ); System.out.println( "Accepte la viande :" + ( testManger ? "oui" : "non" ) ); } }
Développeur en devenir.
A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.
Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.
"On en apprends beaucoup plus par la confrontation que par la conciliation"
Heu... ????
public Animal()
{
ha = HabitudesAlimentaires();
}
Ca c'est possible d'instancier une classe abstraite ? :O Jcomprends plus rien la ^^
React-Hebdo - Newsletter pour se tenir à jour sur l'écosystème React
Grosse connerie de ma part en effet. J'étais surement en train de réflêchir au fait qu'il faudrais une classe parent comme attribut et je me suis surement emmêlé les pinceaux. En effet, il ne devrais pas y avoir d'instantiation dans le classe Animal et le compilateur m'aurais "gueulé" dessus pour avoir essayé d'instantier une classe abstraite :p . Mais bon, le principe reste valable. Dans ce cas de figure, l'héritage multiple aurais donc un intérêt réduit.
Ceci dis il parais tout de même plus intuitif. Par exemple, comment représenter le fait qu'une créature bénéficie du code génétique de ces parents respectifs ? On pourrais avoir deux références mais si une espèce extraterrestre avec a plus de deux donateurs fais son apparition, le modèle est fichu (ou alors on introduit une Liste). A la place on auras plusieurs héritages.
Développeur en devenir.
A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.
Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.
"On en apprends beaucoup plus par la confrontation que par la conciliation"
L'interêt du polymorphisme étant de rendre transparent le vrai type d'un objet qui par exemple est utilisé en tant qu'interface dans une fonction.
Si tu manipules un objet de type Animal, mais que tu dois faire des switch case suivant son type réel :
On brise l'interêt du polymorphisme, ça peut amener des problèmes de maintenances.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void fonction(Animal a) { if(a instance of Chien) { ecrire("Wouf"); if(a instance of Chat) { ecrire("Miaou"); }
Si j'ajoutes une classe Cerf, il y a de grandes possibilités que j'oublis d'ajouter le switch case dans les fonctions qui utilisent un instance of alors qu'il suffirait d'écrire une méthode : parler().
Pour ton exemple, c'est un peu pareil, il faudrait plutôt faire :
if(animal.mange(POULET)) then run forest.
On peut imaginer qu'il y ait des animaux qui ne mangent que de la viande ou du poulet sans manger du poisson (donc qui ne sont finalement pas complètement Carnivore), et ça risque d'ajouter un bug si tu ajoutes une sous-classe particulière qui ne mange que du poulet, qui n'est pas un carnivore et qui devrait être compris dans le if then run forest.
Je n'ai pas dit qu'il ne fallait jamais l'utiliser, mais que dans 95% des cas (voir plus), il y a une méthode plus propre et plus évolutive.
Je ne répondrai à aucune question technique en privé
Ce n'est pas vraiment la même chose. Les interfaces Java se rapproche plus des classes abstraites composées uniquement de méthodes virtuelles pures comme en c++ que de l'héritage multiple. En fait c'est une composition de l'héritage multiple et des méthodes virtuelles pures.
c'est peut etre pas aussi performant que d'implementer un getType() (par example) et comparer le resultat a un entier ou enum ou autre...
Mais je vois pas en quoi c'est mal ?C'est le polymorphisme qui règle ce problème de dépendances de types cela permet aussi de protéger les variations(encore un autre pattern). Les if est-quelque-chose n'a donc que très peu de raison d'être utilisé.Mais, au delà de ca, les designs patterns offrent une solution à ce genre de problème.
Le code de milie montre aussi qu'on brise le principe de conception ouvert(aux extensions)/fermé(aux modifications)
" Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]
Merci pour l'illustration, je trouvais dommage d'ecrire une telle affirmation sans explication...
Il est tout a fait vrai qu'il faut eviter autant que possible les instanceof car cela donne tres facilement de beaux effets de bords, et la c'est le scaphandre assure avec la boite d'aspirine pour la longue seance de debug...
Mais dans de rare situation c'est une belle roue de secours...
---
Farid.
Développeur en devenir.
A la recherche de toute source approfondissant Merise, UML, Java, l'objet, les design patterns hors GOF et le développement en général.
Recherche également des informations sur les techniques de développement et les bonnes pratiques en terme de programmation en entreprise.
"On en apprends beaucoup plus par la confrontation que par la conciliation"
voici un exemple d'effet de bords http://fr.wikipedia.org/wiki/Effet_d...(informatique).
De maniere generique tu veux aller de A vers B, mais tu te retrouves en C, car a un croissement tu as pris une route qui ressemblait a celle de menant a B.
---
Farid.
Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes --- devise SHADOKS
Kit de survie Android : mon guide pour apprendre à programmer sur Android, mon tutoriel sur les web services et enfin l'outil en ligne pour vous faire gagner du temps - N'oubliez pas de consulter la FAQ Android
Les 'inconvénients' qu'on t'a donnés à voir reflètent plus un point de vue sur C++ qu'un point de vue sur l'héritage multiple en général.Envoyé par Kyle128
Si tu veux une présentation plus optimiste de l'héritage multiple il faut s'ouvrir à d'autres langages et regarder du côté de Eiffel par exemple, où l'héritage multiple est bien mieux traité qu'en C++.
Du même auteur: mon projet, le dernier article publié, le blog dvp et le jeu vidéo.
Avant de poser une question je lis les règles du forum.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager