dynamic_cast et upcasting

dynamic_cast et upcasting - C++ - Programmation

Marsh Posté le 28-12-2008 à 05:35:00    

Hi,
 

Code :
  1. #include <iostream>
  2. class A
  3. {
  4. public:
  5.     A() {  }
  6.     virtual ~A() {  }
  7.     virtual void print(){std::cout << "A.\n"; }
  8. };
  9. class B : public A
  10. {
  11. public:
  12.     B() { }
  13.     ~B() {  }
  14.      virtual void print(){std::cout << "B.\n"; }
  15. };
  16. int main()
  17. {
  18.     B* b = new B;
  19.     A * a = dynamic_cast<A*>(b);
  20.     a->print();
  21.     delete a;
  22. }


 
Je souhaite que mon objet B, devienne un ojet A, j'utilse pour cela dynamic_cast... mais ça ne marche pas.
En d'autre terme, pourquoi est ce la fonction print de B qui est appelé et non celle de A ?
 
Je suis obligé d'utiliser la syntaxe a->A::print() ?
 
PS:Quand j'utilise static_cast le problème est le même.
PS2:Vaut-il mieux utilser static ou dynamic ?
Ty.


Message édité par frenchtoucco le 28-12-2008 à 05:59:54

---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 28-12-2008 à 05:35:00   

Reply

Marsh Posté le 28-12-2008 à 11:27:44    

y a pas à caster un B* en A* puisqu'un B est un A.
 
a = b;

Reply

Marsh Posté le 28-12-2008 à 15:24:30    

oui exact, mais pour autant le compilo appel la fonction de B et j'aurais souhaité qu'il appel la fcnt de A...


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 28-12-2008 à 17:59:41    

ben ça contredit le virtual que tu as demandé.
 
Sinon tu peux aussi construire un A à partir de ton B puisque un B est un A.

Code :
  1. B b;
  2. A a(b); // ou un =
  3. a.print();

Reply

Marsh Posté le 28-12-2008 à 19:04:17    

donc un objet fille ne peut pas perdre son caractère fille et ne conserver que son caractère base alors ??


---------------
je connais tout, je ne sais rien, seule certitude, à vouloir trop on finit par tout perdre.
Reply

Marsh Posté le 28-12-2008 à 21:36:12    

frenchtoucco a écrit :

donc un objet fille ne peut pas perdre son caractère fille et ne conserver que son caractère base alors ??


Un objet non, son identité est fixe. Par contre comme je te montrais, tu peux tout à fait construire un A à partir d'un B (construire, faire une copie ou bien faire une affectation).
Pense à des boites imbriquées, le B c'est la boite la plus grande, le A, la boite la plus petite contenu dans la boite B. Quand tu manipules des valeurs et que tu fais a = b, tu ne copies dans a que la partie A de b. Quand on fait du polymorphisme, c'est donc important de manipuler tes A comme des A& ou des A* sinon, si tu travailles par valeur, chaque fois que tu prends un B, tu n'en feras qu'une copie tronquée en A.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed