[C++] histoire de con(-travariance) marrante

histoire de con(-travariance) marrante [C++] - C++ - Programmation

Marsh Posté le 21-07-2004 à 12:31:54    

Je voulais vérifier un truc en lisant la bible de papa ( :jap: ) et voila que je tombe sur un drôle de fonctionnement (MinGW).

Code :
  1. #include<iostream>
  2. #include<string>
  3. using namespace std;
  4. struct classe_base {
  5. string affiche_base() { return "base"; };
  6. };
  7. struct classe_derive : classe_base {
  8. string affiche_derive() { return "derive"; };
  9. };
  10. int main() {
  11. typedef string (classe_derive::*pfm)();
  12. // verification regle contravariance
  13. {
  14. pfm p_affiche_base( &classe_derive::affiche_base );
  15. // string (classe_base::*p_affiche_base_cast)()( p_affiche_base ); // erreur de compilation
  16. }
  17. {
  18. pfm p_affiche_derive( &classe_derive::affiche_derive );
  19. // string (classe_base::*p_affiche_derive_cast)()( p_affiche_derive ); // erreur de compilation
  20. }
  21. // outrepassons la regle contravariance
  22. {
  23. pfm p_affiche_derive( &classe_derive::affiche_derive );
  24. string (classe_base::*p_affiche_derive_cast)()( static_cast<string (classe_base::*)()>(p_affiche_derive) ); // ok
  25. }
  26. // tentative d'execution en outrepassant la regle de contravariance
  27. {
  28. pfm p_affiche_derive( &classe_derive::affiche_derive );
  29. string (classe_base::*p_affiche_derive_cast)()( static_cast<string (classe_base::*)()>(p_affiche_derive) ); // ok
  30. classe_base c;
  31. classe_derive d;
  32. cout << (c.*p_affiche_derive_cast)() << endl; // ...s'execute et appelle affiche_derive de classe_derive...
  33. cout << (d.*p_affiche_derive_cast)() << endl; // ok
  34. }
  35. }


Je m'attendais à obtenir une erreur pendant l'execution du programme ci-dessus. Pas du tout! Je ne pense pas qu'il s'agisse d'un reel probleme d'implémentation au niveau du compilateur mais plutot d'une optimisation qui, par effet de bord, autorise un tel appel de fonction. La regle de contravariance est respectée dans tous les cas.

Reply

Marsh Posté le 21-07-2004 à 12:31:54   

Reply

Marsh Posté le 21-07-2004 à 12:40:25    

t'es un multi à Taz ? [:dawa]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-07-2004 à 12:41:17    

non à xter, en vacances (lol).

Reply

Marsh Posté le 21-07-2004 à 15:39:31    

// outrepassons la regle contravariance
 
ça veut dire quoi ?

Reply

Marsh Posté le 21-07-2004 à 18:30:36    

le C++ caÿ le mal :o

Reply

Marsh Posté le 21-07-2004 à 18:46:51    

Taz : si j'ai bien compris, le compilateur refuse logiquement de convertir un pointeur de fonction membre d'une classe dérivée en un pointeur de fonction membre de la classe de base corespondante. Avec le cast, j'ai voulu obliger le compilateur à ne pas respecter cette regle.

Reply

Marsh Posté le 21-07-2004 à 19:07:19    

et contravariance c'est quoi?

Reply

Marsh Posté le 21-07-2004 à 19:28:37    

Je cite papa Stroustrup : " Une classe dérivée possède, au minimum, les membres hérités de ses classes de base. En fait, elle en possède souvent davantage. Cela siginifie que nous pouvons affecter sans risque le pointeur d'un membre d'une classe de base à celui d'un membre d'une classe dérivée, mais pas le contraire. Cette propriété est souvent nommée contravariance. Par exemple :

Code :
  1. class text : public std_interface {
  2. public:
  3. virtual void print();
  4. }
  5. void (std_interface::*pmi)() = &text::print; // erreur
  6. void (text::*pmt)() = &std_interface::print; // ok


Message édité par Stroustrup-Junior le 21-07-2004 à 19:29:20
Reply

Marsh Posté le 21-07-2004 à 19:48:47    

bah je connaissais pas le mot. Ni qu'il y ait besoin de d'établir une règle la dessuer, ça parait naturel.

Reply

Marsh Posté le 21-07-2004 à 19:56:13    

bah si co/contravariance. la contravariance, c'est ce que font tous les langages car c'est facile à typer, mais ça emmerde touts le développeurs. La covariance, c'est ce dont les développeurs ont besoins mais qu'on sait pas typer.

Reply

Marsh Posté le 21-07-2004 à 19:56:13   

Reply

Marsh Posté le 22-07-2004 à 00:23:29    

C'est pas la covariance qu'on appelle aussi downcast?

Reply

Marsh Posté le 22-07-2004 à 00:36:25    

Reply

Marsh Posté le 22-07-2004 à 00:38:19    

et vive les multiméthodes

Reply

Sujets relatifs:

Leave a Replay

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