Héritage : cast ou non ?

Fermé
Elipso - Modifié par Elipso le 12/04/2013 à 15:38
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 - 19 avril 2013 à 12:21
Bonjour,

Je souhaiterais faire l'héritage suivant :

class A  
class B : public class A  
class C : public class A  


Maintenant, a côté de ça, j'ai un autre héritage de classes qui utilisent, par composition, les class B et C :

class Controler  
class ControlerC : public Controler  
class ControlerB : public Controler  


Ma question est : vaut-il mieux faire :

class Controler {  
   
  public :  
    Controler();  
    ~Controler();  
    void SetModel(A*);  

 protected :  
   A* model;  

} 


et caster après selon le modèle (B/C) qu'on à en membre ou :

class Controler {  
   
  public :  
    Controler();  
    ~Controler();  
}  

class ControlerB : public Controler {  
   
  public :  
    //...  
    SetModel(B*)  

 private :  
  B* model;  
}  

class ControlerC : public Controler {  
   
  public :  
    //...  
    SetModel(C*)  

 private :  
  C* model;  
} 


et ne pas profiter éventuellement du polymorphisme ?

Merci :)

2 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié par mamiemando le 19/04/2013 à 01:34
Je vois au moins deux manières de faire mieux.

1) Si la seule différence de ControlerB et ControlerC c'est d'embarquer un type de Model différent, on peut imaginer simplement avoir une seule classe Controler qui stocke un A* et se reposer sur le lien dynamique pour invoquer de manière appropriée les méthodes implémentées dans A, B ou C. Il faut juste que les méthodes de A soient virtual.
https://forums.commentcamarche.net/forum/affich-27621184-fonctions-virtuelles-en-c#p27622390

2) Une autre manière de faire consiste à ce que Controler soit une classe template qui prend en paramètre un model :

template <typename Tmodel>   
class Controler {   
  protected:   
    Tmodel * model;   
  ...   
}; 

int main() { 
  Controler<B> cb; 
  ... 
  return 0; 
} 


Bonne chance
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
19 avril 2013 à 12:21
salut.
+1 pour les virtuels.
0