classes dérivées et pointeurs

classes dérivées et pointeurs - C++ - Programmation

Marsh Posté le 27-03-2008 à 13:00:24    

salut!

 

http://partiel.c.la

 

Sur le sujet 2007, à la 1ère question j'ai un doute sur l'affichage de unAutreB  (voir le sujet).
Vous seriez simpa de m'expliquer ce point, merci  :jap:

 

En clair est ce qu'un constructeur d'une classe de base peut créer un objet d'une classe dérivée?
class A
{
  public:
  A();
};

 

class B: public A
{
  int sonI;
  public:
  B(int unB);
};

 

*********************

 

Est ce que on peut faire :

 

A * unA
unA = new B(5)

 


merci


Message édité par nebneblan le 27-03-2008 à 13:52:28
Reply

Marsh Posté le 27-03-2008 à 13:00:24   

Reply

Marsh Posté le 27-03-2008 à 15:06:04    

oui, puisque qu'un B est un A.
 
(ton phrasé n'est pas clair, mais le code est OK (modulo les ;))

Reply

Marsh Posté le 28-03-2008 à 10:04:07    

Et par contre qu'est ce qui n'est pas possible de faire?
 
ça déjà:
 
B unB
unB = new A()
 
d'autres?
 
 

Reply

Marsh Posté le 28-03-2008 à 11:03:30    

Que dit ton compilateur si tu tentes une telle manip ?


---------------
Töp of the plöp
Reply

Marsh Posté le 28-03-2008 à 13:04:01    

Je ne sais pas, je n'ai pas essayé, et je ne peut pas essayer pour le moment.
Mais il me semble avoir vu en cour que c'etait impossible. Je me trompe?


Message édité par nebneblan le 28-03-2008 à 13:04:07
Reply

Marsh Posté le 28-03-2008 à 14:48:04    

Il y a une raison pour que ce soit impossible? (indice: le post de Taz donne un très bon indice pour répondre à cette question)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-03-2008 à 18:29:20    

Bah alors j'ai mal noter un truc en cours.
 
Dans mon exemple de cours j'ai ça:
 

Code :
  1. class A1
  2. {
  3.   char sonC;
  4.   public:
  5.      A1(char c);
  6. };
  7. class A3: public A1
  8. {
  9.   string saChaine;
  10.   public:
  11.      A3(string s)
  12. };


 
Et j'ai marquer que les instructions suivantes sont fausses car il y plus de données dans A3 que dans A1:

Code :
  1. A3 * ptrA3;
  2. ptrA3=new A1('y');


 

Reply

Marsh Posté le 28-03-2008 à 18:38:08    

nebneblan a écrit :

Bah alors j'ai mal noter un truc en cours.


J'ai posé une question, je n'ai pas effectué de jugement, et je t'ai donné une piste pour te lancer dans le processus de réponse. Réfléchis un peu et reviens avec la réponse que tu penses correcte et pourquoi tu la penses correcte.
 
Ne prends mon post ni pour un "oui tu te trompes" ni pour un "non tu ne te trompes pas", ce n'est aucun des deux, c'est véritablement une question.


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-03-2008 à 18:48:21    

Bah moi je crois ce que j'ai noter en cours dans ce cas... Je vais pas inventer la réponse, et j'arrive pas à trouver d'explications claires la dessu.
En tout cas, si dans mon cour j'ai noter que c'est impossible je veux bien le croire, mais je veut bien une explication si possible =)

 

Aussi ça me choque quand je vois ça :

 

http://pagesperso-orange.fr/cvince [...] e_A_f2.jpg

 

Il est dit que un A est un B...

 

Je le vois dans d'autres exemples sur le net, mais par exemple si ma classe de base s'appelle Forme, et si ma classe dérivée s'appelle Rectangle, je trouve que ça fait bisarre de dire qu'une Forme est un Rectangle, par contre l'inverse est vrai...

Message cité 1 fois
Message édité par nebneblan le 28-03-2008 à 18:52:11
Reply

Marsh Posté le 28-03-2008 à 19:23:45    

Svp, si quelqu'un passe par là, j'aurais besoins d'un réponse ce soir ^^'

Reply

Marsh Posté le 28-03-2008 à 19:23:45   

Reply

Marsh Posté le 28-03-2008 à 19:28:48    

Dans le contexte suivant :
X* x;
Y* y;
Tu as le droit de faire :
x = y;
Si et seulement si tout Y est un X.  
 
En francais, t'as pas le droit de convertir implicitement un pointeur d'un type "plus general" vers un pointeur d'un type "plus specifique".
 
La raison est simple : supposons que J derive de K. Ca veut dire que tout J est un K, et donc que tout J peut etre vu comme un K. Mais par contre, un K n'est pas forcement un J. Donc pas le droit de faire l'affectation implicite de pointeurs dans l'autre sens.
 
Est-ce que c'est plus clair comme ca?


Message édité par Ace17 le 28-03-2008 à 19:29:28
Reply

Marsh Posté le 28-03-2008 à 19:31:35    

Bof bof...
 
Du coup le code que j'ai posté précédemment est bien faux ou pas?

Reply

Marsh Posté le 28-03-2008 à 19:32:20    

nebneblan a écrit :

je trouve que ça fait bisarre de dire qu'une Forme est un Rectangle, par contre l'inverse est vrai...


Ben voila, une forme n'est pas nécessairement un rectangle, donc de manière plus générale une forme n'est pas un rectangle (alors que l'inverse est vrai), donc ce que tu as cité est effectivement vrai


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 28-03-2008 à 19:35:05    

nebneblan a écrit :

Bof bof...
 
Du coup le code que j'ai posté précédemment est bien faux ou pas?


Remplace tes deux classes par Animal et Chien, et tu verras tout de suite ce qui te semble legitime ou non.

Reply

Marsh Posté le 28-03-2008 à 19:37:45    

masklinn a écrit :


Ben voila, une forme n'est pas nécessairement un rectangle, donc de manière plus générale une forme n'est pas un rectangle (alors que l'inverse est vrai), donc ce que tu as cité est effectivement vrai

 

Mais alors pourquoi l'inverse est noté dans l'image que j'ai postée ?

 

Et ça ?

 

A1 * ptrA1;
A3 * ptrA3;
A3 unA3("bd" );
ptrA1=&unA3; // possible?
ptrA3=&unA3; //possible?

 

D'ailleurs les 2 dernières instructions je pige pas ce qu'elles font...


Message édité par nebneblan le 28-03-2008 à 19:42:36
Reply

Marsh Posté le 28-03-2008 à 19:38:38    

Ace17 a écrit :


Remplace tes deux classes par Animal et Chien, et tu verras tout de suite ce qui te semble legitime ou non.


 
Vu comme ça je dirais que c'est bien faux, c'est bien ça ?

Reply

Marsh Posté le 28-03-2008 à 19:42:04    

nebneblan a écrit :

Vu comme ça je dirais que c'est bien faux, c'est bien ça ?


Je ne sais pas, j'ai pas lu ton code. Mais t'inquiete, a mon avis t'as bon  ;)  
Et n'accorde pas une confiance absolue a tes notes de cours ...

Reply

Marsh Posté le 28-03-2008 à 19:47:57    

C'est justement pour ça que je poste ici.

 

Concernant ce que j'ai écrit avant, vous pouvez me donner des explications svp?

 


Message édité par nebneblan le 28-03-2008 à 19:48:36
Reply

Sujets relatifs:

Leave a Replay

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