Modifier de type d'un attribut dans la classe héritée

Modifier de type d'un attribut dans la classe héritée - C++ - Programmation

Marsh Posté le 08-04-2013 à 00:43:30    

Bonjour,
 
J'ai une classe mère A qui possède un attribut de type une classe C.
Et, j'ai une classe B qui hérite de la classe  A. Je veux changer, dans B, le type de l'attribut à un type hérité de la classe C.
 
Comment je peux réussir ça?
 
Merci d'avance.

Reply

Marsh Posté le 08-04-2013 à 00:43:30   

Reply

Marsh Posté le 08-04-2013 à 02:58:15    

Polymorphisme ?  
 
Si j'ai bien compris, tu as ça :  

Code :
  1. class A
  2. {
  3.   protected:
  4.    C monAttribut;
  5. };


 
Et tu veux faire ça  :
 

Code :
  1. class B : public A
  2. {
  3.   protected:
  4.    D monAttribut; // Avec D hérité de C
  5. };


 
Dans ce cas, tu changes monAttribut par un pointeur :  
 

Code :
  1. class A
  2. {
  3.   protected:
  4.    C* monAttribut;
  5. };


 
Et ensuite, par exemple dans le C-tor de B, tu fais :  

Code :
  1. monAttribut = new D(...);


 
D étant hérité de C, tu conserves les informations de D tout en considérant que c'est un type C, pour récupérer suffit de faire un static_cast (ou dynamic_cast, mais je pense que c'est plus approprié en statique).


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-04-2013 à 16:08:55    

Terminapor a écrit :

Polymorphisme ?

 

Si j'ai bien compris, tu as ça :

Code :
  1. class A
  2. {
  3.   protected:
  4.    C monAttribut;
  5. };
 

Et tu veux faire ça  :

 
Code :
  1. class B : public A
  2. {
  3.   protected:
  4.    D monAttribut; // Avec D hérité de C
  5. };
 

Dans ce cas, tu changes monAttribut par un pointeur :

 
Code :
  1. class A
  2. {
  3.   protected:
  4.    C* monAttribut;
  5. };
 

Et ensuite, par exemple dans le C-tor de B, tu fais :

Code :
  1. monAttribut = new D(...);
 

D étant hérité de C, tu conserves les informations de D tout en considérant que c'est un type C, pour récupérer suffit de faire un static_cast (ou dynamic_cast, mais je pense que c'est plus approprié en statique).

 
Code :
  1. class A
  2. {
  3.   protected:
  4.    std::unique_ptr<C> monAttribut;
  5. };
 

Les pointeurs nus sont une faute de style [:aloy]


Message édité par theshockwave le 08-04-2013 à 16:09:19

---------------
last.fm
Reply

Marsh Posté le 08-04-2013 à 16:23:07    

Ah, au temps pour moi j'ai toujours utilisé des pointeurs nus :D  
 
Même pour faire un tableau dynamique (sans std::vector) vaut mieux utiliser std::unique_ptr / shared_ptr ?
 


---------------
Perhaps you don't deserve to breathe
Reply

Marsh Posté le 08-04-2013 à 17:03:39    

Terminapor a écrit :

Ah, au temps pour moi j'ai toujours utilisé des pointeurs nus :D  
 
Même pour faire un tableau dynamique (sans std::vector) vaut mieux utiliser std::unique_ptr / shared_ptr ?
 


 
C'est surtout que le chemin sur lequel tu diriges notre cher auteur original comporte quelques risques de leak (genre, j'initialise monAttribut en faisant un new dans A::A() et j'oublie de le libérer dans B::B() )
Les pointeurs nus ont de moins en moins de raisons d'être avec C++11. Quand tu manipules un pointeur, tu peux exprimer sa durée de vie directement dans le type, c'est beaucoup plus robuste et lisible.
Quand tu parles de tableau dynamique, si c'est C* = new C[12], je ne vois pas de raison de ne pas utiliser std::vector<C> à la place. Si c'est pour faire C** = new C*[12], alors je ne vois toujours pas de raison de ne pas utiliser std::vector<std::unique_ptr<C>> à la place (ou un autre pointeur riche quelconque)


---------------
last.fm
Reply

Sujets relatifs:

Leave a Replay

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