C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Pointeur sur fonction membre virtuelle

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Loïc Joly
Guest





PostPosted: Wed Oct 25, 2006 5:05 am    Post subject: Pointeur sur fonction membre virtuelle Reply with quote



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





PostPosted: Wed Oct 25, 2006 9:11 am    Post subject: Re: Pointeur sur fonction membre virtuelle Reply with quote



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





PostPosted: Wed Oct 25, 2006 9:11 am    Post subject: Re: Pointeur sur fonction membre virtuelle Reply with quote



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





PostPosted: Wed Oct 25, 2006 9:11 am    Post subject: Re: Pointeur sur fonction membre virtuelle Reply with quote

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





PostPosted: Wed Oct 25, 2006 9:11 am    Post subject: Re: Pointeur sur fonction membre virtuelle Reply with quote

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





PostPosted: Thu Oct 26, 2006 9:11 am    Post subject: Re: Pointeur sur fonction membre virtuelle Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.