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 16/03/2007, à 22:29

tigresse

[C++]Héritage

Bonjour,

j'ai une

classe A{
  private:
    int x, int y;
    int **tab;

    A(int a, int b){
     x = a;
     y = b;
    for(int i=0; i<x; i++){
      tab[i] = new int [x]; 
      for(int j=0; j<y; j++)
        tab[j] =  new int [y];
     }
   }

   int getX(){
      return x;
   }

   int getY(){
     return y;
   }

   int **getTab(){
     return tab;
   }
};

une classe B qui hérite de A :

class B:public A{
   public:
     B(char *nom){
    //...
   }  
};

Dans le cadre d'un exo, B doit hériter de A, A ne doit pas être en attribut.
Dans le constructeur de B, on doit utiliser une instance de A.
Ce que je voudrais savoir, c'est comment faire pour que l'objet A construit dans le constructeur de B puisse être utilisé dans toutes les méthodes de B.
En mettant A en attribut de B, ça ne m'aurait pas poser de soucis mais là, je ne sais pas comment faire.

De plus, je voudrais savoir si lorsqu'une classe B hérite de A, est-ce que dans le constructeur de B, il est obligatoire d'utiliser le constructeur de A ?
Si on est pas obliger, comment faire ?

Merci

Hors ligne

#2 Le 17/03/2007, à 00:10

manal

Re : [C++]Héritage

Dans le constructeur de B, on doit utiliser une instance de A.

Je ne comprend pas très bien cette phrase.

Ce que je voudrais savoir, c'est comment faire pour que l'objet A construit dans le constructeur de B puisse être utilisé dans toutes les méthodes de B.

Tu ne construis pas d'objet A en faisant :

B *my_B = new B("dummy");

Tu créeras une instance de B qui possédera les méthodes et attributs de A (puis que B est dérivé de A), ainsi que les méthodes et attributs de B (bien entendu).

Par exemple :

my_B->getX();

sera correct

De plus, je voudrais savoir si lorsqu'une classe B hérite de A, est-ce que dans le constructeur de B, il est obligatoire d'utiliser le constructeur de A ?

Non

Si on est pas obliger, comment faire ?

Comme tu le fais dans l'exemple que tu donnes, c'est à dire sans préciser que le constructeur de B est une surcharge du constructeur de A.

Mon C++ est assez rouillé, j'espère ne pas te dire de bétises.
Bon courage


Libère ton esprit, et ton cul suivra

Hors ligne

#3 Le 17/03/2007, à 03:21

Luc Hermitte

Re : [C++]Héritage

Quoi ? Quelle surcharge ? Cela n'a pas de sens appliqué aux constructeurs de classes différentes.
Un constructeur de la classe fille ne surcharge en rien un constructeur de la classe mère. C'est une fonction différente (dans le nom et dans la portée aussi j'ai envie de dire).

Un constructeur de la classe mère sera toujours utilisé. Tu n'a pas le choix.
Si tu ne précises rien dans la liste d'initialisation de tes constructeurs des classes filles, c'est le constructeur par défaut (celui à 0 argument) de la classe mère qui sera appelé.

#4 Le 17/03/2007, à 16:24

Moka_one

Re : [C++]Héritage

comme te l'as dit luc hermitte tu es obligé d'utiliser le constructeur de la classe mere (A) dans le constructeur de la classe fille (B) sinon ce seront les valeurs par defaut qui seront choisit (tu n'a d'ailleur pas fait de constructeur par defaut dans ta classe A qui devrait ressembler a ca par exemple

A(){
     x = 2;
     y = 2;
    for(int i=0; i<x; i++){
      tab[i] = new int [x]; 
      for(int j=0; j<y; j++)
        tab[j] =  new int [y];
     }

j'ai pris 2 par defaut pour remplir un peu ton tab

Ensuite ton constructeur B devra faire appel au constructeur mere

B::B(char *nom):A(x,y){}

ou a celui par defaut

B::B(char *nom):A(){}

B peut avoir un constructeur par defaut lui aussi.
Ensuite
Si tu créée un objet B il sera automatiquement "relié" à A et tu pourras lui affecter les methodes de A ou de B comme bon te semble.
par exemple
dans ta classe B tu pourra faire
affichertab();
en admettant que tu ait une methode affichertab() dans ta classe A.
Voila j'espere avoir repondu a toute tes questions

Dernière modification par Moka_one (Le 17/03/2007, à 16:25)


La défaite est éphémère
Seule la victoire est éternelle

Hors ligne

#5 Le 17/03/2007, à 16:40

manal

Re : [C++]Héritage

Tu as raison Luc, je me suis un peu emmêlé les pinceaux. Mon C++ est vraiment rouillé. J'ai surtout confondu avec le PHP dans lequel tu peux faire appel ou non aux méthodes parentes.
J'espère tout de même ne pas avoir dit trop de bêtises.


Libère ton esprit, et ton cul suivra

Hors ligne

#6 Le 17/03/2007, à 17:08

best_friend_fr

Re : [C++]Héritage

Salut

Dans ton cas, le plus simple est de créer un constructeur par défaut

A() {
}
qui ne fait rien
et une méthode init

void A::init(int i,int j) {
}
qui fait l'initialisation.

Ensuite, tu fais ton constructeur B

B::B(char* nom):A() {
chargement_de_nom(nom)
init(i,j);
}


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne