question sur l'héritage multiple

question sur l'héritage multiple - C++ - Programmation

Marsh Posté le 07-04-2008 à 23:12:55    

Bonjour,
 
j'aimerai savoir comment contourner un problème, lorsqu'on a un héritage multiple en losange comme ca :
 
http://www.commentcamarche.net/poo/images/animaux2.gif
 
si j'ai bien compris, les classes Herbivore et Carnivore devrait hériter virtuellement de la classe animal, pour éviter que la classe Omnivore contiennent les données de la classe Animal en double  :pt1cable:  
 
Or, si je fais cela, j'ai deux problémes que j'arrive pas à résoudre.
 
(*) Le premier, par exemple si Lion est une classe qui hérite de Carnivore (une classe abstraite) :
 

Code :
  1. Animal * a = new Lion[4];


 
Comment je fais pour me déplacer dans le tableau ? C'est le bordel, non ? Par exemple si je veux faire :

Code :
  1. a[4].une_super_methode_de_lion();


 
ca marche pas car "a" est un pointeur vers un animal et pas un lion. Est ce que je suis obliger de faire :
 

Code :
  1. Lion * b =  new Lion[4];
  2. b[4].une_super_methode_de_lion();
  3. //ou bien ..
  4. Lion * c = static_cast<Lion*>(a);
  5. c[4].une_super_methode_de_lion();
  6. //et puis :


 
??
 
(*) Et le deuxième problème, qui découle du problème 1. Si je considère la classe humain qui est dérivée de Omnivore. Je peux pas faire de static_cast, car j'ai alors le problème suivant à la compilation :
 
cannot convert an 'identifier1*' to an 'identifier2*'; conversion from a virtual base class is implied
 
http://msdn2.microsoft.com/en-us/l [...] S.71).aspx
 
car les classes Herbivore et Carnivore héritent virtuellement de la classe animal,
 
Comment faire ?
 
 
 
merci beaucoup par avance  :love:  :love:  
 
 
 

Reply

Marsh Posté le 07-04-2008 à 23:12:55   

Reply

Marsh Posté le 08-04-2008 à 07:45:14    

dynamic_cast ... pas static_cast

 
Code :
  1. Lion * plion;
  2. if( plion = dynamic_cast<Lion*>(a[4]) )
  3.   plion->methode_de_lion();
  4. else
  5.   // Ce pointeur n'est pas un Lion
 

achètes toi un bouquin, ce genre de question sont abordés dans le chapitre 1 de la plupart des bouquins sérieux sur le sujet

Message cité 1 fois
Message édité par Joel F le 08-04-2008 à 07:46:12
Reply

Marsh Posté le 08-04-2008 à 13:22:36    

Joel F a écrit :

dynamic_cast ... pas static_cast

 
Code :
  1. Lion * plion;
  2. if( plion = dynamic_cast<Lion*>(a[4]) )
  3.   plion->methode_de_lion();
  4. else
  5.   // Ce pointeur n'est pas un Lion
 

achètes toi un bouquin, ce genre de question sont abordés dans le chapitre 1 de la plupart des bouquins sérieux sur le sujet

 

salut,
merci beaucoup pour ta réponse ! ben j'ai deux  bouquins mais ils en parlent pas vraiment ... et j'ai regardé sur cette page :
http://www.cplusplus.com/doc/tutorial/typecasting.html

 

ils disent que le static_cast peut etre utilisé pour caster une classe mère vers une classe dérivée (mais que le développeur doit savoir ce qu'il fait) c'est pour ca que je pensais utiliser ca ....

 

non ?  :sweat:

 

EDIT: ok après relecture j'ai la réponse à ma question ... merci


Message édité par in_your_phion le 08-04-2008 à 13:47:49
Reply

Marsh Posté le 08-04-2008 à 13:54:15    

salut,
en fait j'ai une autre question : dans le cas où on fait un Animal * p = new Lion; , alors il faut faire une conversion avec dynamic_cast avant de faire un delete ?

Reply

Marsh Posté le 08-04-2008 à 13:54:51    

static_cast c'est pour une conversion qui peut être faîte de manière sure à la compilation. Pas la peine de sauter sur static_cast trop vite, la plus part du temps, une conversion par construction suffit (voire est implicite).

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed