OVH Cloud OVH Cloud

surcharge marche pas ??

5 réponses
Avatar
charly
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;
}

5 réponses

Avatar
Jean-Marc Bourguet
charly writes:

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

Avatar
charly
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 :)


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 :)

Avatar
Jean-Marc Bourguet
charly writes:

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 :)



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


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

Donc
Oups, ay sir :) !



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 !


Avatar
Horst Kraemer
On Wed, 04 Feb 2004 10:36:05 +0100, charly
wrote:

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