Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/03/2007, à 17:54

Laure

[C++]Héritage

Bonjour,

J'ai écrit le programme suivant :

#include <iostream>

class A{
private:
  int *tab;
  int taille;

public:
  A(int t){
   taille = t;
   tab = new int[t];
   for(int i=0; i<t; i++)
    set(i,i+1);
  }
 
  A(){}

  int get(int i){
    return tab[i];
  }
  
  void set(int i, int val){
   tab[i] = val;
  }

  int getTaille(){
   return taille;
  }

  void affiche(){
   for(int i=0; i<getTaille(); i++)
    std::cout << tab[i] << " ";
    std::cout << std::endl;
  }
};


/*class B{
 private:
   A a;
 public:
  B(A aa){
   a = aa;
  }
 
  void application(int val){
   for(int i=0; i<a.getTaille(); i++)
     a.set(i,a.get(i)*val);
  }
 
  void affiche(){
   a.affiche();
  }
};*/


class B:public A{
  public:
  void application(int val){
   for(int i=0; i<A::getTaille(); i++)
     A::set(i,A::get(i)*val);
  }
 
  void affiche(){
   A::affiche();
  }
};


int main(){
//Cas 1
/*A a(10);
a.affiche();
B b(a);
b.application(7);
b.affiche();*/

//Cas 2
A a(10);
a.affiche();
B b;
b.application(7);
b.affiche();
return 0;
}

J'ai fait 2 cas :
  1 la classe B n'hérite pas de la classe A mais à un objet A en attribut
  2 la classe B hérite de la classe A

Dans le cas 1, le lancement du programme donne :

1 2 3 4 5 6 7 8 9 10
7 14 21 28 35 42 49 56 63 70

Dans le cas 2, le lancement du programme donne :

1 2 3 4 5 6 7 8 9 10

C'est à dire que l'appel de la méthode affiche de la classe B ne donne rien.

Qu'est-ce que je dois modifier dans le code pour que le cas 2 donne le même résultat que le cas 1.

Merci

#2 Le 12/03/2007, à 18:35

kitone

Re : [C++]Héritage

Salut,

C'est vraiment très simple, il te suffit de crée B avec en argument 10.

B b(10);
b.application(7);
b.affiche();

Explication :

//Cas 2
A a(10);
a.affiche();
B b;
b.application(7);
b.affiche();
return 0;

Dans le cas 2 à aucun moment tu initialise ton tableau (class A) car tu utilise B b; et donc tu utilise le constructeur A() { } et non pas A(int t). Le fait de crée avant un objet a (A a(10)) ne sert à rien car c'est un objet independant de B.

Dans le cas 2 il y a "3 objets" de crée : A ( A a(10) ) puis B ( B b; ) et dans le B il y a un A puisqu'il en herite.

Ensuite dans ta class B il n'est pas utile de faire A::ma_fonction (ex: A::getTaille()) puisque tu herite de la class A. Il n'est pas non plus utile de crée une fonction affiche qui appel A::affiche puisque B herite de A et donc des fonctions.

a+
kitone


Sous-titrage sous linux : subtitleeditor

Hors ligne