Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1800 connectés 

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°801741
Stroustrup​-Junior
Posté le 21-07-2004 à 12:31:54  profilanswer
 

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.

mood
Publicité
Posté le 21-07-2004 à 12:31:54  profilanswer
 

n°801751
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 21-07-2004 à 12:40:25  profilanswer
 

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


---------------
J'ai un string dans l'array (Paris Hilton)
n°801753
Stroustrup​-Junior
Posté le 21-07-2004 à 12:41:17  profilanswer
 

non à xter, en vacances (lol).

n°801958
Taz
bisounours-codeur
Posté le 21-07-2004 à 15:39:31  profilanswer
 

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

n°802286
Tamahome
⭐⭐⭐⭐⭐
Posté le 21-07-2004 à 18:30:36  profilanswer
 

le C++ caÿ le mal :o

n°802299
Stroustrup​-Junior
Posté le 21-07-2004 à 18:46:51  profilanswer
 

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.

n°802313
Taz
bisounours-codeur
Posté le 21-07-2004 à 19:07:19  profilanswer
 

et contravariance c'est quoi?

n°802324
Stroustrup​-Junior
Posté le 21-07-2004 à 19:28:37  profilanswer
 

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
n°802334
Taz
bisounours-codeur
Posté le 21-07-2004 à 19:48:47  profilanswer
 

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

n°802340
nraynaud
lol
Posté le 21-07-2004 à 19:56:13  profilanswer
 

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.

mood
Publicité
Posté le 21-07-2004 à 19:56:13  profilanswer
 

n°802635
Ace17
Posté le 22-07-2004 à 00:23:29  profilanswer
 

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

n°802651
Taz
bisounours-codeur
Posté le 22-07-2004 à 00:36:25  profilanswer
 
n°802654
Taz
bisounours-codeur
Posté le 22-07-2004 à 00:38:19  profilanswer
 

et vive les multiméthodes


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

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

 

Sujets relatifs
histoire de pointeurUne histoire de formulaire qui ne passe pas !!!!
[C++] histoire de constructeurs[comics] histoire de la prog'
[C++] Histoire de membres statiquesHistoire de placement de noeuds et de liens...
une histoire d'allocateur mémoire[SQL] Une histoire de requete et de date...
Histoire de cookies...Histoire de chemin relatif...
Plus de sujets relatifs à : [C++] histoire de con(-travariance) marrante


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR