OVH Cloud OVH Cloud

Operator = et classe héritée

3 réponses
Avatar
Eclisse
Bonjour à tous !

Bien que programmeur C++ depuis de nombreuses années, j'ai un problème que
je ne sais pas résoudre... et je crains fort qu'il soit pourtant évident !!!

Alors tant pis, même si je dois en pleurer de honte, je vous le soumets :

J'ai une première classe définie comme suit :
class clA {

private:

int i,j,k;

public:

void operator=(clA& Modele);

};

pour laquelle j'implémente l'opérateur = de la façon suivante :
void clA::operator=(clA& Modele)

{

i = Modele.i;

j = Modele.j;

k = Modele.k;

}

Bien.
Maintenant, je déclare une nouvelle classe qui hérite de la première de la
façon suivante :
class clB : public clA {

private:

char a,b,c;

public:

void operator=(clB& Modele);

};

J'ai alors un problème lorsque je veux écrire le corps de l'opérateur = :
comment dire que je veux réutiliser l'opérateur = de la classe mère pour
affecter le contenu des variables propres de la classe mère ???
void clB::operator=(clB& Modele)

{

a = Modele.a;

b = Modele.b;

c = Modele.c;

// affectation des variables propres à clA ???

}


Merci mille fois de votre aide, et encore pardon si je ne suis qu'une grosse
truffe !

3 réponses

Avatar
Michel Decima

J'ai alors un problème lorsque je veux écrire le corps de l'opérateur = :
comment dire que je veux réutiliser l'opérateur = de la classe mère pour
affecter le contenu des variables propres de la classe mère ???


il suffit d'appeler l'operateur de la classe de base:

void clB::operator=(clB& Modele)
{
clA::operator=(Modele);
a = Modele.a;
b = Modele.b;
c = Modele.c;
}

Avatar
Eclisse
"Michel Decima" a écrit dans le message de
news: eloqsf$lv1$

J'ai alors un problème lorsque je veux écrire le corps de l'opérateur = :
comment dire que je veux réutiliser l'opérateur = de la classe mère pour
affecter le contenu des variables propres de la classe mère ???


il suffit d'appeler l'operateur de la classe de base:

void clB::operator=(clB& Modele)
{
clA::operator=(Modele); a = Modele.a;
b = Modele.b;
c = Modele.c;
}


Wouahouh, trop fort... et trop simple, bouh, snif, comment n'ai-je pas
réussi à trouver dans le Stroustrup...

Merci encore !!!


Avatar
James Kanze
Eclisse wrote:

Michel a déjà répondu à ta question, mais deux petits
commentaires supplémentaires s'imposent :

J'ai une première classe définie comme suit :
class clA {
private:
int i,j,k;

public:
void operator=(clA& Modele);


C'est vraiment pas très habituel que l'operator= renvoie void.
Typiquement, il renvoie clA&, parce que c'est ainsi qu'il se
comporte le plus comme l'operator= sur les types de base. Il y a
des arguments pour renvoyer clA const&, à la place, et il y a
bien sûr des cas spéciaux (Proxy, etc.), mais en dehors des cas
spéciaux, void me paraît très discutable.

};


[...]
Bien.
Maintenant, je déclare une nouvelle classe qui hérite de la première


Alors, est-ce que tu es certain de vouloir supporter
l'affectation ? L'héritage C++ a beaucoup d'utilisations
différentes, mais une des plus fréquentes, c'est bien
l'implémentation de la dérivation OO, avec l'idée que la classe
dérivée « estUn » de la classe de base, et une utilisation de
la polymorphisme. Or, cette utilisation se combine mal avec
l'affectation ; il suppose une sémantique de référence, alors
que l'affectation suppose une sémantique de valeur. Donc, par
exemple, quelque chose comme :
clA* p1 ;
clA* p2 ;
*p1 = *p2 ;
n'a pas de sens.

--
James Kanze (GABI Software) email:
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