Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 14/01/2017, à 02:09

Destroyers

[C++] Héritage en diamant : réutilisabilité pour un tiers ?

Bonjour,

Je voudrais créer une hiérarchie de classes qui m'impose un héritage en diamant, mais il faudrait en plus que toutes les classes (mêmes celles ayant des héritages virtuelles) soient re-dérivable par un autre utilisateur lambda. Du coups je me demande s'il existe une technique pour que ça reste intuitif pour cet utilisateur (sans avoir a appeler le constructeur de la classe grand-mère, héritée virtuellement).

Merci d'avance smile

Hors ligne

#2 Le 14/01/2017, à 13:42

grigouille

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Destroyers a écrit :

sans avoir a appeler le constructeur de la classe grand-mère, héritée virtuellement
Merci d'avance smile

J'ai un peu du mal à te comprendre. C'est quoi un constructeur hérité virtuellement ?

Peux-tu nous proposer un exemple de ton problème ?


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#3 Le 14/01/2017, à 16:47

claudius01

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Bonjour,

En plus de "... sans avoir a appeler le constructeur de la classe grand-mère, héritée virtuellement", quelle est donc la raison qui conduit à:
"Je voudrais créer une hiérarchie de classes qui m'impose un héritage en diamant" ?

De plus, cet "héritage en diamant", a plus d'inconvénients que d'avantages, ce qui fait que certains langages, et non des moindres, ne le permettent tout simplement pas ... jusqu'à même interdire l'héritage multiple sauf pour les interfaces (contrats à respecter) dont l'implémentation est à la charge de la classe qui en hérite.

J'ose espérer que cela n'est qu'un exercice de style en C++ pour montrer qu'il n'y a pas plus casse gueule et qu'en final doit être à bannir au profit d'une solution plus simple et surtout portable...

Hors ligne

#4 Le 14/01/2017, à 20:06

Destroyers

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Error -----> Detailed_Error -----> Loaded_Detailed_Error
         -----> Loaded_Error

Error stock un string
Detailed stock en plus la fonction et le fichier d'occurence
Loaded charge le texte de l'erreur depuis un fichier
Loaded_Detailed fait les deux précédents à la fois

on a donc

class Error{};
class Detailed_Error : virtual public Error{};
class Loaded_Error : virtual public Error{};
class Loaded_Detailed_Error : public Loaded_Error , public Detailed_Error{};

L'héritage virtuel est nécessaire afin de ne considérer qu'une seule fois les attributs et les méthodes de la classe grand mère (Error) dans le petit fille (Loaded_Detailed_Error). Et cela impose, dans le constructeur de la petite fille, d'appeler le constructeur de la classe grand mère.

Loaded_Detailed_Error::Loaded_Detailed_Error(args) : Error(arg), Detailed_Error(arg), Loaded_Error(arg){}

Et comme je voudrais que ce soient des classes dérivables par un utilisateur lambda (par exemple pour faire une erreur en GUI ?), je voulais savoir s'il existait un moyen de ne pas avoir à appeler directement ce constructeur (celui de Error) dans les classes de l'utilisateur.

Car cet utilisateur va devoir faire ça :

class Derived : public Loaded_Detailed_Error{};
Derived::Derived(args) : Error(arg), Loaded_Detailed_Error(arg){}

Et ce n'est pas très intuitif pour lui ...

Je sens que vous allez me conseiller d'autres méthodes que l'héritage en diamant mais je vous avoue que c'est pas trop le but de ma question ^^

Je vous remercie.

Dernière modification par Destroyers (Le 14/01/2017, à 20:14)

Hors ligne

#5 Le 14/01/2017, à 22:00

claudius01

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Mouais ( ͡° ͜ʖ ͡°), ( ͡⊙ ͜ʖ ͡⊙) et ( ͡◉ ͜ʖ ͡◉)

Désolé, mais l'héritage multiple sauf pour les interfaces, l'héritage en diamant et l'héritage virtuel conduit de toute façon à une usine à gaz qui sera difficilement maintenable et surtout ... non portable.

Je ne regrette pas de pratiquer le Java (toujours en tête des langages demandés en plus des autres naturellement ;-) et ce, en // du C++ du fait des portages que je dois faire et qui m'évitent de me prendre le chou.

Comme on dit maintenant sur les forums et sans animosité ... je sors.

Cordialement, Bon courage, A+

Hors ligne

#6 Le 14/01/2017, à 22:30

grigouille

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Je crois que tu n'as pas le choix. Une classe de base virtuelle est toujours considérée comme une classe de base directe.


Debian (xfce) 12
HP LaserJet M1132 MFP

Hors ligne

#7 Le 15/01/2017, à 15:39

Destroyers

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Bon bah je ferai avec alors.

Pourquoi non portable ? Ce que je fais là compile sur linux, windows et raspberry pi, je vois pas ce qu'il faut de plus =p

Bon et sinon vous voyez une solution pour faire ce que j'ai présenté sans diamant du coup ?

Dernière modification par Destroyers (Le 15/01/2017, à 15:40)

Hors ligne

#8 Le 15/01/2017, à 20:48

claudius01

Re : [C++] Héritage en diamant : réutilisabilité pour un tiers ?

Effectivement, tu as raison Destroyers pour les plates-formes citées, mais je pensais également portage vers d'autre langages (déformation professionnelle ;-)

Hors ligne