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 

surcharge marche pas ??

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





PostPosted: Wed Feb 04, 2004 9:36 am    Post subject: surcharge marche pas ?? Reply with quote



Bonjour,

Une question de bon matin :)

Soit une classe A avec une méthode m1()
Soit une classe B qui dérive A avec une méthode m2 qui surcharge m1(int a)

Mnt, dans le prog principal, j'instancie un objet de classe B et
j'appelle la méthode m1()

Le compilo grogne -> la méthode m2 ne prend 0 paramters.

Si je surcharge ma classe dans ma classe fille, ca veut pas dire que je
ne veux plus de la méthode d'origine :)

Evidemment, si je caste la classe dérivée vers la classe mère, là, ca
marche.

Comportement normal ou spécificité du compilo (Visual Studio C++) ?

Code :

class CBase
{
protected:
CBase() {}

public:
virtual ~CBase() {}

static void testMethod() {}

void method1() {}
};

class CDerived : public CBase
{
protected:
CDerived() {}

public:
virtual ~CDerived() {}

static CDerived *Create() { return new CDerived(); }

void method1(int i) {}
};


void main()
{
CDerived *pObj;

pObj = CDerived::Create();

// ((CBase *)pObj)->method1();
pObj->method1();

delete pObj;
}
Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed Feb 04, 2004 9:46 am    Post subject: Re: surcharge marche pas ?? Reply with quote



charly <charlyspam (AT) yahoo (DOT) fr> writes:

Quote:
Une question de bon matin :)

Soit une classe A avec une méthode m1()
Soit une classe B qui dérive A avec une méthode m2 qui surcharge m1(int a)

Mnt, dans le prog principal, j'instancie un objet de classe B et j'appelle
la méthode m1()

Le compilo grogne -> la méthode m2 ne prend 0 paramters.

Les classes sont des scopes. Et on ne cherche dans les parents qui si
on n'a pas trouve dans la classe fille. Donc une fois trouve m1(int)
on ne trouve jamais m1(). Solution, utiliser using dans la definition
de B. (Ca peut etre dangereux, j'ai souvenir d'un cas ou il y avait
une conversion implicite qui faisait que ca compilait, mais ne
fonctionnait pas comme desire -- d'accord on peut discutter de la
pertinence de la conception dans ce cas mais on ne fait pas toujours
ce qu'on veut).

Au fait, le mot methode n'a pas de definition en C++, et j'en ai vu
utiliser au moins deux differentes de facon significative. Il vaut
mieux utiliser fonction membre/fonction membre virtuelle.

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
charly
Guest





PostPosted: Wed Feb 04, 2004 10:01 am    Post subject: Re: surcharge marche pas ?? Reply with quote



Quote:
Les classes sont des scopes. Et on ne cherche dans les parents qui si
on n'a pas trouve dans la classe fille. Donc une fois trouve m1(int)
on ne trouve jamais m1(). Solution, utiliser using dans la definition
de B. (Ca peut etre dangereux, j'ai souvenir d'un cas ou il y avait
une conversion implicite qui faisait que ca compilait, mais ne
fonctionnait pas comme desire -- d'accord on peut discutter de la
pertinence de la conception dans ce cas mais on ne fait pas toujours
ce qu'on veut).
Bon tant pis, merci, on va caster alors Smile


Quote:
Au fait, le mot methode n'a pas de definition en C++, et j'en ai vu
utiliser au moins deux differentes de facon significative. Il vaut
mieux utiliser fonction membre/fonction membre virtuelle.

Ok, j'en prends bonne note :)



Back to top
Jean-Marc Bourguet
Guest





PostPosted: Wed Feb 04, 2004 10:12 am    Post subject: Re: surcharge marche pas ?? Reply with quote

charly <charlyspam (AT) yahoo (DOT) fr> writes:

Quote:
Les classes sont des scopes. Et on ne cherche dans les parents qui si
on n'a pas trouve dans la classe fille. Donc une fois trouve m1(int)
on ne trouve jamais m1(). Solution, utiliser using dans la definition
de B. (Ca peut etre dangereux, j'ai souvenir d'un cas ou il y avait
une conversion implicite qui faisait que ca compilait, mais ne
fonctionnait pas comme desire -- d'accord on peut discutter de la
pertinence de la conception dans ce cas mais on ne fait pas toujours
ce qu'on veut).
Bon tant pis, merci, on va caster alors Smile

Non: j'ai ecrit "Solution, utiliser using dans la definition de B."

Donc

struct A
{
void mf();
};

struct B: public A
{
using A::mf;

void mf(int);
};

int main() {
B x;
x.mf();
}

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
charly
Guest





PostPosted: Wed Feb 04, 2004 10:53 am    Post subject: Re: surcharge marche pas ?? Reply with quote


Quote:
Non: j'ai ecrit "Solution, utiliser using dans la definition de B."

Donc
Oups, ay sir Smile !



Quote:
struct A
{
void mf();
};

struct B: public A
{
using A::mf;

void mf(int);
};

int main() {
B x;
x.mf();
}
C'est bcp + clair mnt : merci bcp !


Back to top
Horst Kraemer
Guest





PostPosted: Wed Feb 04, 2004 12:26 pm    Post subject: Re: surcharge marche pas ?? Reply with quote

On Wed, 04 Feb 2004 10:36:05 +0100, charly <charlyspam (AT) yahoo (DOT) fr>
wrote:

Quote:
Une question de bon matin :)

Soit une classe A avec une méthode m1()
Soit une classe B qui dérive A avec une méthode m2 qui surcharge m1(int a)

Ce n'est pas une surcharge mais une redéfinition.
m1(int) surcharge m1() si et seulement si les deux fonctions ont été
définies dans la même classe. Dans ton cas m1(int) cache m1().

Tu pourrais appeler Base::m1() pour on objet du type Derived par

pDerived->Base::m1()


Une autre méthode est l'utilisation du mot clé 'using'

class Derived : public Base
{
using Base::m1;
void m1(int) {}
...
};

Par cette méthode la définition de m1() est traitée comme si elle
avait lieu dans Derived, et alors m1(int) surcharge m1() dans le sens
propre du terme.

Dans ce cas

pDerived->m1()

devrait fonctionner quand ton compilateur est à jour (avec VC++ 6.0 on
se sait jamais....)

--
Horst


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.