Partage
  • Partager sur Facebook
  • Partager sur Twitter

C++: Heritage de classe avec un vecteur

comment reagit l'objet?

Sujet résolu
30 mars 2011 à 2:51:02

Bonjour!
Merci pour les excellents cours présents sur ce site ^^

Je fait des essais sur l'héritage des classes.
Jusqu'ici pas de soucis! ^^
Mais,ca se complique quand je met met objets dans des vecteurs d'objets:

J'ai une classe mere "Creatures", qui a pour enfant:
"Humain" qui a pour enfants:
"Zombie" et "Joueur".

Ensuite, pour garder le compte de tout ce beau monde, je les range dans un vecteur:

vecteur de type "Creatures", admettons "CreaturesListe".
Ma liste comprend donc:
- un (ou plus) Objet de type Humain,
- un (ou plus) Objet de type Zombie,
- un (ou plus) Objet de type Joueur.

Si j'ai bien compris ce qui se passe.
Maintenant, si j'appelle un methode de type A, dont chaque classe dispose de sa version, que se passe-t-il?
La liste étant de type "Creatures" se borne a executer Creatures.A pour chaque objet (d'apres ce que j'observe) ?
Ou est-il possible de lancer la methode A de l'objet Humain?

C'est sur ce point que je bloque un peu...

  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2011 à 9:02:39

si ta méthode est déclarée avec le mot clé virtual dans la classe mère, alors la résolution est faite à l'exécution, et ça sera toujours la méthode fille appelée.
Si elle n'est pas virtuelle, alors ça sera toujours la méthode de la classe mère.
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
30 mars 2011 à 9:25:04

Voila, epso a tout dit.
Par defaut le compilateur va régler tes instructions en fonction de ce qu'il sait. Donc par defaut il va utiliser le type qu'il connait, dans ton cas Creature et donc appelé Creatures.A
Si toi maintenant tu ne veux pas qu'il appel cette methode mais celle du type réel, met "virtual" avant la définition de la methode. Cela dit au compilateur "je ne veux pas que tu fasse le liens tout de suite, fait le au moment de l'execution".
Il ira ainsi automatiquement cherché celui qui correspond aux différentes methodes.

Il est a noté tout de même que la résolution de méthode virtuel est par nature plus lente a l'execution. C'est normale ton programme doit chercher quel méthode appelé au cours de l'execution. Bon dans le cas général la différence est négligeables, mais sur des opérations qui sont appelé tres tres souvent, cela peut marquer un goulot d'etrenglement
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2011 à 11:35:09

Un grand merci pour votre rapidité!
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2011 à 12:50:25

C'est pas pour faire ma raclette mais...

#include <iostream>
#include <vector>

struct Base {
    virtual void Test() {
        std::cout << "Base::Test()" << std::endl ;
    }
} ;

struct Derived : public Base {
    virtual void Test() {
        std::cout << "Derived::Test()" << std::endl ;
    }
} ;

int main() {
    std::vector<Base> myVect ;
    Base b ;
    Derived d ;
    myVect.push_back(b) ;
    myVect.push_back(d) ;
    myVect[0].Test() ;
    myVect[1].Test() ;
    return 0 ;
}


Et paf ! Ca fait des chocapics :

Base::Test()
Base::Test()


Je maintiens donc : slicing ! Cf Google ou Développez pour plus de détails...
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
30 mars 2011 à 12:57:01

hum je n'ai pas le temps de tester mais, si je me souvient bien c'est en faite que le . est forcément résolut a la compilation contrairement à la fleche...
donc dans ton cas c'est plutôt ça en faite :
(&(myVect[1]))->Test();

</span>

edit: Je n'ai rien dit. J'avais oublié que vector faisais une copie et ne conserve pas une référence de l'objet. Donc en effet 'slicing'
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2011 à 13:24:51

oui bien sur, si tu veux conserver ton polymorphisme, il faut stocker tes objets par pointeurs dans ton vector, sinon oui, c'est juste du slicing...
  • Partager sur Facebook
  • Partager sur Twitter
30 mars 2011 à 15:23:28

Citation : epso

si ta méthode est déclarée avec le mot clé virtual dans la classe mère, alors la résolution est faite à l'exécution, et ça sera toujours la méthode fille appelée


Lol
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2023 à 16:52:15

slicing, cela veut dire que pour l'objet dérivé d, on en garde seulement la partie de type Base ?
Cela me semble logique, car la taille en mémoire d'un objet Base ou Derived n'est pas la même. Il n'y a pas de probleme si ce sont des pointeurs, mais sinon on ne peut que "slice" l'objet (afin que la taille en mémoire soit la même) ...
  • Partager sur Facebook
  • Partager sur Twitter
10 novembre 2023 à 17:03:10

@GustaveRobichon Bonjour, merci de ne pas déterrer d'ancien sujet résolu, celui-ci date de 2011. Pour poster une nouvelle question créer votre propre sujet avec une description du problème que vous rencontrez ainsi que le code que vous avez écrit.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ici.

  • Partager sur Facebook
  • Partager sur Twitter