Valeur par defaut et heritage + methode virtuelle

Valeur par defaut et heritage + methode virtuelle - C++ - Programmation

Marsh Posté le 25-06-2008 à 14:22:51    

comment vous résoudriez ce problème d'heritage et de valeurs par défaut ? :
 

Code :
  1. class A
  2. {
  3. public :
  4.    virtual methode1(param1, param2);
  5. };
  6. class B : public A
  7. {
  8. public :
  9.    methode1(param1, param2 = 0);
  10. };
  11. B::methode1(param1, param2)
  12. {
  13.    //code
  14. }


 
 
Usage  
 
B monB;
monB.methode1(machin);
 
Là le compilateur me dit que la méthode1 ne prend pas 1 seul parametre (mais 2)
 
Les valeur par defaut ca ne marche pas avec la redefinition de classes virtuelles ?


Message édité par NounouRs le 25-06-2008 à 16:18:59
Reply

Marsh Posté le 25-06-2008 à 14:22:51   

Reply

Marsh Posté le 25-06-2008 à 14:40:12    

Bah la tu appeles methode 1 de A (qui d'ailleurs n'est pas définie).

 

Ca me parait donc un poil normal que ça compile pas.

 

edit: et aussi faudrait un type de retour à ta methode.
re-edit: moué apparement visual aime pas trop pour sa part, tu peux toujours surcharger methode1 mais bon ya p'tet mieux. Il me semble avoir lu quelque part que c'était un peu le mal de faire de l'héritage mélangé avec des params par défaut mais pas moyen de retrouver où.


Message édité par kyntriad le 25-06-2008 à 14:54:56

---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 25-06-2008 à 16:19:25    

*oui, pardon, j'ai corrigé ca... c'est bien la methode de B que je souhaite appeler
 
Et il s'agit d'une méthode virtuelle (qui pourrait tres bien etre virutelle pure (=0) et donc ce serait une classe abstraite ce qui rentre tres bien dans le principe d'orienté objet... en JAVA ya que ca)


Message édité par NounouRs le 25-06-2008 à 16:21:03
Reply

Marsh Posté le 25-06-2008 à 16:40:35    

Bah en l'occurence c'est un fait que visual studio 2005 n'aime pas quand on fait cela. Après savoir le pourquoi du comment je sais pas trop (je cherche en fait ça m'intrigue un peu tout ça)

 

edit: ah j'avais pas vu que tu avais changé le A en B :p Ca marche d'ailleurs à présent, si tu met methode1 de A en virtuelle pure ou que tu lui met un corps.


Message édité par kyntriad le 25-06-2008 à 16:58:30

---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 25-06-2008 à 17:22:54    

la présence de paramètres par défaut fait parti de la signature non ?
Donc faut que ca soit cohérent avec le prototype de la fonction héritée.

Reply

Marsh Posté le 25-06-2008 à 19:00:17    

Joel F a écrit :

la présence de paramètres par défaut fait parti de la signature non ?
Donc faut que ca soit cohérent avec le prototype de la fonction héritée.


non. ce que tu veux faire est déconseillé, ça fait pas bon ménage du tout.

 

si tu veux ce comportement, c'est peut-être aussi bien de faire:
- une virtual do_stuff(a, b);
- une pas virtual stuff(a, b = c)  { return this->do_stuff(a, b); }


Message édité par Taz le 25-06-2008 à 19:20:07
Reply

Marsh Posté le 25-06-2008 à 20:12:15    

je note :o

Reply

Marsh Posté le 25-06-2008 à 21:17:14    

les valeurs par défaut, c'est du maquillage pour compilateur. D'ailleurs tu ne déclares tes valeurs par défaut que dans tes déclarations et tu ne les répètes pas dans tes définitions.

Reply

Marsh Posté le 25-06-2008 à 21:30:02    

Ça se passe comment en fait la résolution des valeurs par défaut au niveau compilo ? (en particulier par rapport à l'héritage)

 

j'arrive po a retrouver le bouquin ou j'avais lu des trucs là dessus...


Message édité par kyntriad le 25-06-2008 à 21:30:51

---------------
You can't start a fire with moonlight
Reply

Marsh Posté le 25-06-2008 à 21:52:03    

bah c'est ambigüe, ça provoque une erreur, il faut expliciter avec un cast de fonction membre et tout

Reply

Marsh Posté le 25-06-2008 à 21:52:03   

Reply

Marsh Posté le 25-06-2008 à 21:57:39    

genre un bon vieux
 

Code :
  1. (x.*static_cast<void (X::*)()>(&X::foo))();


 
pour faire la différence entre
 

Code :
  1. struct X {
  2.   void foo();
  3.   void foo(int = 42);
  4. };

Reply

Marsh Posté le 26-06-2008 à 14:02:55    

Taz a écrit :

genre un bon vieux
 

Code :
  1. (x.*static_cast<void (X::*)()>(&X::foo))();


 
pour faire la différence entre
 

Code :
  1. struct X {
  2.   void foo();
  3.   void foo(int = 42);
  4. };



Mais c'est horrible [:kzimir]


Message édité par sligor le 26-06-2008 à 14:03:07
Reply

Sujets relatifs:

Leave a Replay

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