CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[c++] héritage et classe virtuelle.

dnob700
dnob700
Niveau 10
28 décembre 2005 à 01:27:05

J´ai un petit problème de POO : j´ai une classe A qui est presque entièrement virtuelle pure à l´exception d´un membre :
virtual A& operator<<(A& autre)
{
char t;
while (!autre.eof())
{
autre >> t;
operator<<(t);
}
return *this;
}

et bien sur les opérateur << et >> sont définie comme virtuelle pure dans A pour qu´il soient obligatoirement implémentés dans les classes qui en hérite.

Et justement, j´ai deux classe B et C qui héritent toutes deux de A et lorsque je veux faire :
B b;
C c;
b << c;
je pensait qu´il utiliserait automatiquement la fonction que j´ai défini plus haut, mais apparement, il ne peut pas convertir b en une instance de A car il me dit qu´il n´y a pas de fonction aproprié pour l´opérateur <<. Alors que si je déclare, dans le corps de la déclaration de B l´oprateur :
B& operator<<(A& autre);
avec la même définition, ça marche sans problème. Mais ça m´oblige à la définir dans chaque clase qui hérite de A, alors que le corps de la fonction est exactement identique partout.

Y aurait-il une solution plus élégante ?

merci d´avance pour vos réponses.

dnob700
dnob700
Niveau 10
28 décembre 2005 à 01:44:05

Et j´ai un autre problème lié à celui là : la classe C doit être géré différement lorsque l´on en extrait des données. avec l´opérateur >> il n´y a pas de problème vu qu´elle est à gauche, mais avec l´opérateur << c´est plus dur.

Alors j´ai écrit une fonction :

A& operator<<(A&,C&);

j´ai d´abord pensé que lorsque le cas va se présenter il va gueuler comme quoi il y a plusieurs fonctions possible et qu´il ne sait pas laquelle prendre, mais il ne l´a pas fait mais par contre dans le cas :
b << c;
il va utiliser la fonction de B : operator<<(A&) plutot que la fonction quui n´appartient à aucune classe operator<<(A&,C&);

là encore, y a-t-il un moyen de le forcer à utiliser la "bonne" fonction plutot que celle de la classe sans pour autant écrire dans chaque classe une fonctions pour prendre ce cas en charge. Car là, ce n´est pas juste inutiles comme tout à l´heure, c´est tout à fait contre la logique de la chose vu que ça casserait la "virtualité" de mes classes.

merci encore pour vos futures réponses ...

godrik
godrik
Niveau 30
28 décembre 2005 à 13:31:11

pour ton second probleme, utilise la notion de visiteurs, je te la fais en 2 milisecondes:
class A
{
virtual fnct (A& toto) =0;

}

et tu voudrais faire un traitement en fonction du type de toto,
le plus simple consiste a faire dans fnct un appel a toto.traitement(); ainsi tu peux réecrire une partie de la fonction fct en fonction du type de parametre.
(tu vois le principe ?)

au sujet du premier probleme,
le bout de code suivant fonctionne:
class A
{
public:
virtual A& operator << (A&) = 0;
};

class B: public A
{
public:
virtual A& operator << (A&);
};

class C: public A
{
public:
virtual A& operator << (A&);
};

A& B::operator<< (A& toto)
{
return toto;
}

A& C::operator<< (A& toto)
{
return toto;
}

int main()
{
B b;
C c;
b<<c;
c<<b;

return 0;
}

Dnas ce que tu raconte, quand tu redefini en mettant B& operator<<... tu definit une nouvelle fonciton, tu n´utilise absolument pas le polymorphisme.
ca m´etonne par contre que "operator<<(t); " fonctionne, tu as redefini << pour les char ?

dnob700
dnob700
Niveau 10
28 décembre 2005 à 15:55:14

oui, j´ai redéfini << pour les char.
Mais ce qui me génait avec le premier problème c´est que justement a priori il ne devrait pas y avoir besoin de redéfinir
A& operator<<(A&);

dans B et C vu que leur définition est exactement la même et ne dépend que de membres qui sont définie dans A. (tout comme dans ton exemple).

ce que j´aurais voulu faire (avec ton exemple) c´est :

class A
{
public:
virtual A& operator << (A& toto) {return toto;};
};

class B: public A
{
};

class C: public A
{
};

int main()
{
B b;
C c;
b<<c;
c<<b;

return 0;
}

qui compile sans problème, mais si jamais je rajoutte :

class B: public A
{
B& operator<<(int z){return *this;}
};

pour la définition de B, alors là ça ne marche plus. Parce que le << de B remplace celui de A, même s´il n´ont pas la même signature.

godrik
godrik
Niveau 30
29 décembre 2005 à 16:18:03

avec quoi compiles tu?

mandan:~/test> cat coin.cpp
class A
{
public:
virtual A& operator << (A&) = 0;
};

class B: public A
{
public:
virtual A& operator << (A&);
B& operator<<(int z);
};

class C: public A
{
public:
virtual A& operator << (A&);
};

A& B::operator<< (A& toto)
{
return toto;
}

B& B::operator<<(int z)
{
return *this
}

A& C::operator<< (A& toto)
{
return toto;
}

int main()
{
B b;
C c;
b<<c;
c<<b;

return 0;
}
mandan:~/test> g++ --version
g++ (GCC) 4.0.2 20050808 (prerelease) (Ubuntu 4.0.1-4ubuntu9)
Copyright © 2005 Free Software Foundation, Inc.
Ce logiciel est libre; voir les sources pour les conditions de copie. Il n´y a PAS
GARANTIE; ni implicite pour le MARCHANDAGE ou pour un BUT PARTICULIER.
mandan:~/test> make coin
g++ coin.cpp -o coin
mandan:~/test>

j´ai comme l´impression que tu as un probleme dans ton compilateur, ce que tu fais devrais marcher ...

dnob700
dnob700
Niveau 10
30 décembre 2005 à 00:15:37

bien sûr ça marche, mais ce n´est pas le problème que j´avais : Dans mon exemple, les fonctions de la classe de bases étaient masquées par des fonctions de même nom mais de signature différentes dans les classes dérivé (je ne redéfinissais pas les même fonctions dans les classes dérivées, come tu le fait dans ton exemple). En fait j´ai résolu ce problème en incluant une directive :
using A::operator<<;
dans la déclaration des classes B et C.

merci quand même de ton aide.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de Jeux
  • Programmation
  • Création de sites web
  • Linux
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment