 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Loïc Joly Guest
|
Posted: Wed Oct 25, 2006 5:05 am Post subject: Pointeur sur fonction membre virtuelle |
|
|
Bonjour,
Soit le cas suivant :
struct A
{
virtual void f();
};
struct B : A
{
virtual void f();
}
typedef void (A::*FctPtr)();
FctPtr fct = &A::f;
int main()
{
A *b = new B;
b->*fct();
}
(désolé s'il y a des fautes de frappes, j'ai pas compilé le code, c'est
l'idée qui compte)
Dans ce cas, quelle fonction est appelée : A::f ou B::f ?
J'ai cherché dans la norme sans rien trouver de bien convainquant.
Le 10.3.12
Explicit qualification with the scope operator (5.1) suppresses the
virtual call mechanism.
Me fait penser que comme on a explicité A::f, il n'y aura pas appel
virtuel, mais j'avoue ne pas savoir si ce passage est suffisant ou même
approprié.
Merci,
--
Loïc |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 25, 2006 9:11 am Post subject: Re: Pointeur sur fonction membre virtuelle |
|
|
Lahsen <lahsenba (AT) free (DOT) fr> writes:
| Quote: | Trace la fonction f dans A et dans B et puis appelle la par un pointeur
et tu sera.
|
Loïc cherche peut-être quelque chose de plus sûr que le comportement de son
compilateur (et puis il a écrit qu'il n'en avait pas sous la main)
| Quote: | FctPtr fct = &A::f;
b->*fct();
|
(b->*fct)();
| Quote: | C'est quoi *fct()??? Il faut peut être la déclarer avant de l'appeler!!!
|
J'ai laissé sa définition et corrigé son utilisation.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org |
|
| Back to top |
|
 |
Michel Decima Guest
|
Posted: Wed Oct 25, 2006 9:11 am Post subject: Re: Pointeur sur fonction membre virtuelle |
|
|
Lahsen a écrit :
| Quote: | typedef void (A::*FctPtr)();
FctPtr fct = &A::f;
int main()
{
A *b = new B;
b->*fct();
}
C'est quoi *fct()???
|
C'est l'appel de la fonction via un pointeur sur fonction membre.
D'ailleurs mon g++ me dit qu'il faut des parentheses supplementaires,
comme ceci: (b->*fct)();
| Quote: | Il faut peut être la déclarer avant de l'appeler!!!
|
C'est fait sur la ligne qui precede le main() |
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Oct 25, 2006 9:11 am Post subject: Re: Pointeur sur fonction membre virtuelle |
|
|
Loïc Joly <loic.actarus.joly (AT) numericable (DOT) fr> writes:
| Quote: | Bonjour,
Soit le cas suivant :
struct A
{
virtual void f();
};
struct B : A
{
virtual void f();
}
|
;
| Quote: | typedef void (A::*FctPtr)();
FctPtr fct = &A::f;
int main()
{
A *b = new B;
b->*fct();
(b->*fct)();
}
(désolé s'il y a des fautes de frappes, j'ai pas compilé le code, c'est
l'idée qui compte)
Dans ce cas, quelle fonction est appelée : A::f ou B::f ?
|
B::f -- d'après mes souvenirs et mes compilateurs -- mais j'ai trouvé de
référence.
| Quote: | J'ai cherché dans la norme sans rien trouver de bien convainquant. Le
10.3.12 Explicit qualification with the scope operator (5.1) suppresses
the virtual call mechanism.
Me fait penser que comme on a explicité A::f, il n'y aura pas appel
virtuel, mais j'avoue ne pas savoir si ce passage est suffisant ou même
approprié.
|
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org |
|
| Back to top |
|
 |
Lahsen Guest
|
Posted: Wed Oct 25, 2006 9:11 am Post subject: Re: Pointeur sur fonction membre virtuelle |
|
|
Trace la fonction f dans A et dans B et puis appelle la par un pointeur
et tu sera.
Loïc Joly a écrit :
| Quote: | Bonjour,
Soit le cas suivant :
struct A
{
virtual void f();
};
|
void A::f()
{
cout << " f de A est appelé" << endl;
}
| Quote: | struct B : A
{
virtual void f();
}
|
void B::f()
{
cout << " f de B est appelé" << endl;
}
| Quote: | typedef void (A::*FctPtr)();
FctPtr fct = &A::f;
int main()
{
A *b = new B;
b->*fct();
}
|
C'est quoi *fct()??? Il faut peut être la déclarer avant de l'appeler!!!
| Quote: | (désolé s'il y a des fautes de frappes, j'ai pas compilé le code, c'est
l'idée qui compte)
Dans ce cas, quelle fonction est appelée : A::f ou B::f ?
J'ai cherché dans la norme sans rien trouver de bien convainquant.
Le 10.3.12
Explicit qualification with the scope operator (5.1) suppresses the
virtual call mechanism.
Me fait penser que comme on a explicité A::f, il n'y aura pas appel
virtuel, mais j'avoue ne pas savoir si ce passage est suffisant ou même
approprié.
Merci,
|
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Thu Oct 26, 2006 9:11 am Post subject: Re: Pointeur sur fonction membre virtuelle |
|
|
Loïc Joly wrote:
| Quote: | James Kanze a écrit :
En passant, c'est intéressant à noter qu'avec des pointeurs au
membre, on a même une forme assez restreinte de la virtualité
pour les données :
struct A {} ;
struct B : A { int i ; } ;
int A::*pi = static_cast< int A::* >( &B::i ) ;
void
f( A* p )
{
std::cout << p->*pi ;
}
C'est légal, et ça marche, dans la mesure où l'objet désigné par
p a réelement un type dynamique B (ou quelque chose qui dérive
de B -- et je crois qu'il y a des restrictions dans le cas des
dérivations virtuelles).
As-tu déjà rencontré des cas concrets où ce genre de chose était utilisé ?
|
Oui:-(. En fait, si je le connais, c'est parce que j'ai
rencontré du code qui s'en servait. J'avais cru que c'était
illégal, j'ai cherché dans la norme pour trouver le passage
exact qui l'interdisait, et j'ai trouvé qu'au contraire, c'est
explicitement permis et supporté.
N'empèche que je ne m'en servirai pas.
--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34 |
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|