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 

Prb polymorphisme et héritage

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





PostPosted: Thu Apr 14, 2005 3:29 pm    Post subject: Prb polymorphisme et héritage Reply with quote



Bonjour,

J'ai le problème suivant. Schématiquement j'ai :

class A
{
public:
void Get(param_type1);
};

class B : public A
{
public:
void Get(param_type2);
void Get(param_type3);
};

void B::Get(param_type3)
{
// J'appelle ici la classe parente.
Get(param_type1); ### Ne compile pas
A::Get(param_type1); ### Compile.
}

De même si j'instancie B :
B* const l_pB = new B;

Si je fais B->Get(param_type1), j'ai la même erreur de compilation, à savoir
param_type1 ne peux être casté en param_type2.

Vous voyez pourquoi ? Je séche là... :-/
Back to top
Ahmed MOHAMED ALI
Guest





PostPosted: Thu Apr 14, 2005 4:19 pm    Post subject: Re: Prb polymorphisme et héritage Reply with quote



Bonjour,

Quote:
void B::Get(param_type3)
{
// J'appelle ici la classe parente.
Get(param_type1); ### Ne compile pas
A::Get(param_type1); ### Compile.
}

De même si j'instancie B :
B* const l_pB = new B;

Si je fais B->Get(param_type1), j'ai la même erreur de compilation, à
savoir
param_type1 ne peux être casté en param_type2.

Vous voyez pourquoi ? Je séche là... :-/

A proprement parler, il n'y a pas de problème de polymorphisme dans ton cas,
tu n'as pas de méthode virtuelle.
C'est normal que B->Get(param_type1) ne compile pas.Dans le classe B, il n'
y a pas une telle fonction.
Celle héritée de A est masquée par void Get(param_type2) et void
Get(param_type3);
Pour appeler A::Get ,tu as le choix entre faire un using A::Get dans la
classe B ou bien d'appeler la fonction comme ceci : A::Get(...)

Ahmed




"Emmanuel V." <everguet (AT) vitechnology (DOT) com> wrote

Quote:
Bonjour,

J'ai le problème suivant. Schématiquement j'ai :

class A
{
public:
void Get(param_type1);
};

class B : public A
{
public:
void Get(param_type2);
void Get(param_type3);
};

void B::Get(param_type3)
{
// J'appelle ici la classe parente.
Get(param_type1); ### Ne compile pas
A::Get(param_type1); ### Compile.
}

De même si j'instancie B :
B* const l_pB = new B;

Si je fais B->Get(param_type1), j'ai la même erreur de compilation, à
savoir
param_type1 ne peux être casté en param_type2.

Vous voyez pourquoi ? Je séche là... :-/



Back to top
Vincent Lascaux
Guest





PostPosted: Thu Apr 14, 2005 4:27 pm    Post subject: Re: Prb polymorphisme et héritage Reply with quote



Quote:
Celle héritée de A est masquée par void Get(param_type2) et void
Get(param_type3);

Il faut avoué que c'est assez déroutant (moi aussi j'ai été surpris par
l'erreur de compilation lorsque le problème m'est apparu pour la première
fois. Qu'est ce qui a motivé le choix de ne pas faire comme si on avait
écrit using A::foo pour toutes les fonctions foo parentes ?

--
Vincent



Back to top
Ahmed MOHAMED ALI
Guest





PostPosted: Fri Apr 15, 2005 4:06 am    Post subject: Re: Prb polymorphisme et héritage Reply with quote

Quote:
Celle héritée de A est masquée par void Get(param_type2) et void
Get(param_type3);

Il faut avoué que c'est assez déroutant (moi aussi j'ai été surpris par
l'erreur de compilation lorsque le problème m'est apparu pour la première
fois. Qu'est ce qui a motivé le choix de ne pas faire comme si on avait
écrit using A::foo pour toutes les fonctions foo parentes ?

--
Vincent



En fait, la règle de surcharge des fonctions membres s'inscrit dans une
règle plus générale qui veut que les fonctions candidates
lors la résolution doivent appartenir à la même portée.Une classe dérivée
est située dans une portée différente de sa classe de base,les
fonctions de la classe de base ne seront donc pas prises en compte.

Ahmed MOHAMED ALI


"Vincent Lascaux" <nospam (AT) nospam (DOT) org> wrote

Quote:
Celle héritée de A est masquée par void Get(param_type2) et void
Get(param_type3);

Il faut avoué que c'est assez déroutant (moi aussi j'ai été surpris par
l'erreur de compilation lorsque le problème m'est apparu pour la première
fois. Qu'est ce qui a motivé le choix de ne pas faire comme si on avait
écrit using A::foo pour toutes les fonctions foo parentes ?

--
Vincent





Back to top
Emmanuel V.
Guest





PostPosted: Fri Apr 15, 2005 7:47 am    Post subject: Re: Prb polymorphisme et héritage Reply with quote

"Ahmed MOHAMED ALI" <ahmedmo (AT) wanadoo (DOT) fr> wrote in message > En fait, la règle de surcharge des fonctions membres s'inscrit dans une
Quote:
règle plus générale qui veut que les fonctions candidates
lors la résolution doivent appartenir à la même portée.Une classe dérivée
est située dans une portée différente de sa classe de base,les
fonctions de la classe de base ne seront donc pas prises en compte.

Ahmed MOHAMED ALI

Merci pour cette réponse. Ce problème est-il spécifique à C++, ou

existe t-il aussi pour C# ou Java ?

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Fri Apr 15, 2005 11:39 am    Post subject: Re: Prb polymorphisme et héritage Reply with quote

Vincent Lascaux wrote:
Quote:
Celle héritée de A est masquée par void Get(param_type2) et
void Get(param_type3);

Il faut avoué que c'est assez déroutant (moi aussi j'ai été
surpris par l'erreur de compilation lorsque le problème m'est
apparu pour la première fois. Qu'est ce qui a motivé le choix
de ne pas faire comme si on avait écrit using A::foo pour
toutes les fonctions foo parentes ?

La cohérence, peut-être. En général, on cherche un symbole
jusqu'à le trouver, pas plus loin. Ce sont des portées
différentes.

Côté pratique, je crois qu'une des motivations était d'empécher
que l'addition d'une fonction dans une classe de base puisse
modifier la sémantique de la classe dérivée. Donc, si dans la
classe dérivée, j'ai défini une fonction f(int), et que je
l'appelle avec un char, l'ajonction d'une fonction f(char) dans
la classe de base ne doit pas changer la résolution du
surcharge.

--
James Kanze GABI Software
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
kanze@gabi-soft.fr
Guest





PostPosted: Fri Apr 15, 2005 12:07 pm    Post subject: Re: Prb polymorphisme et héritage Reply with quote

Emmanuel V. wrote:

Quote:
"Ahmed MOHAMED ALI" <ahmedmo (AT) wanadoo (DOT) fr> wrote in message
En fait, la règle de surcharge des fonctions membres
s'inscrit dans une règle plus générale qui veut que les
fonctions candidates lors la résolution doivent appartenir à
la même portée.Une classe dérivée est située dans une portée
différente de sa classe de base,les fonctions de la classe
de base ne seront donc pas prises en compte.

Merci pour cette réponse. Ce problème est-il spécifique à C++,
ou existe t-il aussi pour C# ou Java ?

Je ne connais pas le C#, mais quant à Java : la situation n'est
pas tout à fait identique en Java, dans la mésure où il n'y a
pas de fonctions globales. La règle Java est donc qu'on cherche
la fonction partout où c'est visible, dans toutes les portées.
Toujours.

En revanche, on a toujours le problème en Java qu'ajouter une
fonction avec le même nom dans une classe de base peut modifier
le comportement de la classe dérivée, d'une façon pas forcément
prévisible. Le problème est attenué du fait que les fonctions
privées ne sont pas visibles dans les classes dérivées, mais il
existe quand même.

--
James Kanze GABI Software
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.