Pages : 1
#1 Le 12/03/2007, à 16: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, à 17: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
Pages : 1