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

Help : Heritage en C++

Ruffi
Ruffi
Niveau 9
27 février 2004 à 17:35:26

Je fait quelque chose que l´on peut resumer comme sa :

Class A : public CObject{
private :
/ /divers truc
public :
/ /divers truc
vitual ~A();
A(const A &);
A operator = ( const A& original);
virtual bool afficher();
}

Class B : public A{
private :
/ /divers truc
public :
/ /divers truc
vitual ~B();
B(const B &);
B operator = ( const B& original);
virtual bool afficher();
}

Class C : public A{
private :
/ /divers truc
public :
/ /divers truc
vitual ~C();
C(const C &);
C operator = ( const C& original);
virtual bool afficher();
}

ils sont utilisé dans une classe comme sa :
Class D : public CObject{
private:
A m_objet;
public:
A GetObjet();
void SetObjet(A _objet);
}

Mon probleme est le suivant : sa marche pas ! lorsque je fait " ObjetD.GetObjet().affiche(); avec dans D::m_objet un objet de type B ou C, sa marche pas . .. :snif:
Probleme d´heritage ? de virtual ?

Aidez moi !

Ruffi
Ruffi
Niveau 9
27 février 2004 à 18:20:12

Faut-il mettre le constructeur de copie et l´operateur = en virtual ?

Ruffi
Ruffi
Niveau 9
27 février 2004 à 18:46:21

J´ai oublié de preciser, c´est que qu´il y a une CListe ( classe MFC) d´objet D : c´est pour cela que j´ai besoin de l´operateur = et du constructeur de copie.

D´ailleur j´ai oublié de signaler qu´il y a aussi un operateur = et un constructeur de copie dans la classe D

Mon but, c´est de faire un truc comme sa :

Boucle de parcour de la CListe d´objet D
Fonction afficher de m_objet ( qu´il soit A, B ou C)
Fin de la boucle

kookii
kookii
Niveau 4
27 février 2004 à 20:33:43

enleve le virtual devant la fct afficher dans tes classes B et C

bobkillerTRUE
bobkillerTRUE
Niveau 5
27 février 2004 à 23:06:17

Toji t une merde ! (mais bon je suis une merde + 1)

:ok: bonne chance !

JeanYvesYves
JeanYvesYves
Niveau 10
27 février 2004 à 23:08:21

oui, ça vient de " virtual"

dis toi que quand une classe contient " virtual", tu ne peux pas l´instancier.

genre ta classe A contient virtual :

A inst; / / tu crees une instance inst de A
--> erreur.

si ta classe A contient " virtual bool afficher()"
alors, OBLIGATOIREMENT, les classes qui héritent ( B et C) et que tu veux instancier DOIVENT CONTENIR :

" bool afficher()"

Sans Virtual

si tu le remets, alors tu ne pourras pas instancier B, ni C, et tu devras faire des classes qui héritent de B ou C, sans virtual.

Altonfrere
Altonfrere
Niveau 10
28 février 2004 à 09:52:34

Nan pas du tout !
Tu confonds avec les fonctions virtuelles pures !

´virtual´ déclare uniquement une méthode de la classe pouvant être redéfinie dans les classes dérivées.

mais lorsque tu écris :

virtual bool afficher()=0;

Là oui tu es obligé de dériver la classe et tu ne pourras pas instancier la classe abstraite.

Ruffi
Ruffi
Niveau 9
28 février 2004 à 10:54:38

Une precision : la classe A n´est pas virtuel pure.
En plus, sur mon prog, c´est la seul qui marche quand je fait afficher().

JeanYvesYves
JeanYvesYves
Niveau 10
28 février 2004 à 13:07:35

Ah vi, C vrai, t´avais pas mis =0, je me suis emporté :)

kookii
kookii
Niveau 4
28 février 2004 à 13:16:43

Qd tu crees tes objets b ou c tu fais bien un truc du genre
A* obj = new B(...); ?
pcq normalement si apres tu fais obj->affiche() ben c´est la fct affiche de B qui est lancee...

Ruffi
Ruffi
Niveau 9
28 février 2004 à 13:29:16

Non, je fait pas des new...
Pour que sa marche, il faut obligatoirement passer par pointeur ?

kookii
kookii
Niveau 4
28 février 2004 à 13:31:21

j´ai jamais testé sans pointeurs, mais j´ai tjrs cru que c´était nécessaire. Il faudrait une confirmation de quelqu´un qui s´y connait mieux :)

Ruffi
Ruffi
Niveau 9
28 février 2004 à 14:15:18

Je suis en train de passer avec des pointeurs.

J´ai un probleme pour le constructeur de copie ( et l´operateur =, car il y a juste un return this en plus) de la classe D :

Je doit recréer le pointeur m_objet
je fait :
if(original.m_objet){
m_objet=new A;
m_objet=original.m_objet;
}
else
m_objet=NULL;

Probleme : il me fera donc un new A meme si c´est un objet B ou C.

kookii
kookii
Niveau 4
28 février 2004 à 15:25:23

essaye de voir avec dynamic_cast
par ex

m_objet=dynamic_cast<A*>(original)
normalement apres ca, m_objet pointe sur un objet de meme type que l´original.

Ruffi
Ruffi
Niveau 9
28 février 2004 à 16:36:39

dynamic_cast ?
ok, je vais voir
Merci :)

Ruffi
Ruffi
Niveau 9
28 février 2004 à 16:46:04

dynamic_cast fait aussi le new ?

hs_dino
hs_dino
Niveau 9
28 février 2004 à 17:30:30

Il n´y a pas de problèmes.

Dis plutot ce que tu souhaiterais obtenir et que tu n´obtients pas.

Pour le dynamic_cast, celà n´a rien à voir. Le dynamic_cast est cast de type dynamique qui s´occupe de rechercher la classe grace a son nom. Ceci est tres couteux en temps CPU car il correspond a un strcmp() qui est effectué sur toutes les classes parents, de plus le dynamic_cast ne va fonctionner QUE si vous activer ces informations de noms de classes plus connues sous le nom RTTI pour RunTime Type Informations. On utilise ceci uniquement en cas d´heritage virtuel. Donc si tu n´utilises pas d´heritage virtuel, n´utilise JAMAIS les dynamic_cast et RTTI.

kookii
kookii
Niveau 4
28 février 2004 à 17:31:43

non tu fais avant
m_objet = new A

Il me semble que ça devrait marcher.

maxime999
maxime999
Niveau 8
28 février 2004 à 18:18:19

Les pointeurs de sont pas du tout obligatoire
si les fonctions de recopies et d´affectations sont bien ecrites ils devraient ne pas y avoir de probleme.

donne nous le code source des ces fonctions justement car le probleme doit se situer la.

Ruffi
Ruffi
Niveau 9
28 février 2004 à 18:52:09

Je voudrai bien donner le code source, mais il est fait dans le cadre d´un projet ou on est plusieurs, et il est assez consequent.
Je vais quand meme essayer de voir avec les autres membres du groupe pour metre le projet sous licence GPL.

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