Héritage : cast ou non ?

Elipso -  
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   -
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 33758 Date d'inscription   Statut Modérateur Dernière intervention   7 877
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
salut.
+1 pour les virtuels.
0