Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
833 connectés 

  FORUM HardWare.fr
  Programmation

  [C++] Héritage balaise!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Héritage balaise!

n°56383
bkadoum
Posté le 30-08-2001 à 17:31:32  profilanswer
 

salut les fous!
 
Voici le truc, j'ai une classe A avec plein d'héritiers genre:
 
class A
{
};
 
class A1 : virtual public A
{
};
 
class A2 : virtual public A
{
};
 
Voila ca fait deja pas mal de classe filles. Maintenant dans mon main j'aimerai crée une fonction pour passer n'importe lequel de ces objets:
 
//Déclaration des objets
A Objet1;
A1 Objet2;
A2 Objet3;
 
//Appels de la fonction Process(A *pA)
Process(&Objet1); //La ca marche
Process(&Objet2); //La ca marche pas!
Process(&Objet3); //La non plus!
 
Ca marche pas car la fonction peut passer seulement des objets A et non ses héritiers. Je vais quand même pas faire une fonction pour chaques objets, comment faire UNE seule fonction dans lequel je pourrais passer TOUS les objets héritants de A?

mood
Publicité
Posté le 30-08-2001 à 17:31:32  profilanswer
 

n°56392
minusplus
Posté le 30-08-2001 à 18:45:20  profilanswer
 

ben kess tu dis, c'est la définition même de l'héritage ?
 
kess li marche pas ?
 
ça compile pas ?

n°56398
SoWhatIn22
Posté le 30-08-2001 à 19:19:07  profilanswer
 

en effet, ca devrait passer.
Si ca passe pas, essaye de faire un casting:
 
Process((A *) &Objet2);
Process((A *) &Objet3);

n°56399
minusplus
Posté le 30-08-2001 à 19:21:05  profilanswer
 

heu... si ça passe pas tel-quel, j'arrête tout et je pars élever des chèvres dans le lubéron !

n°56400
youdontcar​e
Posté le 30-08-2001 à 19:22:41  profilanswer
 

je ne connais pas la syntaxe 'class A1 : virtual public A ' ... c'est valide ? t'as essayé juste 'class A1 : public A' ?
 
et pas oublié de mettre les méthodes en virtual ?

n°56403
minusplus
Posté le 30-08-2001 à 19:32:30  profilanswer
 

Bon allez, arretez
 
 
 
 
fichier t.cc :
-------------------------------------------------
class A{};
 
class A1 : virtual public A{};
class A2 : virtual public A{};
 
 
void proc(A* pa){
 return;
};
 
A a;
A1 a1;
A2 a2;
 
 
int main(){
  proc(&a);
  proc(&a1);
  proc(&a2);
 
}
 
------------------------------------------
manu@bassed6:~$ g++ t.cc
manu@bassed6:~$  
 
 
 
ça compile, CQFD.

n°56415
bkadoum
Posté le 30-08-2001 à 22:21:59  profilanswer
 

ah zut c'est juste, dans ma fonction Process(A *pA) j'utilise des fonction membres d'une classe fille:
 
Process(A *pA)
{
pA->MembreDeA1();
}
 
Donc si je passe en paramètre la classe A ca joue pas puisque la classe de base n'hérite pas d'une classe fille! ouin est-ce qu'il y a un moyen de rendre le code un peu souple ou il faut que j'améliore la structure? Faut utiliser des fonctions virtuelles?

n°56440
aqwsezsxdr
Posté le 30-08-2001 à 23:52:41  profilanswer
 

tu declare  
virtual void membreDeA1()=0; dans A
 
puis ds les classes filles, tu implemente des versions adaptés au contexte.
C'est le principe meme du polymorphisme.
Tu peux enlever le =0 si tu peux donner un comportement coherent dans A à MembreDeA1.

n°56473
BENB
100% Lux.
Posté le 31-08-2001 à 10:01:34  profilanswer
 

minusplus a écrit a écrit :

heu... si ça passe pas tel-quel, j'arrête tout et je pars élever des chèvres dans le lubéron !  




Tant pis pour les chevres...
La simplification a encore frappee...
Attention, souvent en voulait simplifier votre code vous enlevez aussi le bug !
Je ne dis pas qu'il faut livrer tout votre code sur le forum, mais plutot penser a verifier que en simplifiant vous n'enlevez pas le probleme...

n°56485
n0mad
inscrit au XXe siècle
Posté le 31-08-2001 à 10:26:02  profilanswer
 

C'est pas un problème balaise d'heritage... je suis déçu.


---------------
Pipiru piru piru pipiru pi
mood
Publicité
Posté le 31-08-2001 à 10:26:02  profilanswer
 

n°56813
bkadoum
Posté le 01-09-2001 à 17:50:27  profilanswer
 

Ok j'ai ajouté des pures fonctions virtuelles dans la classe A. Mais maintenant je peux plus instancier un objet A ou dérivé de A. J'ai déclarés des pointeurs uniquement sur des classes dérivées de A qui ne contiennent pourtant aucune fonctions virtuelles. Je les crées avec NEW mais veut pas, ca compile pas, il dit qu'il peut pas instancier! Pourquoi?

n°56866
aqwsezsxdr
Posté le 01-09-2001 à 19:59:24  profilanswer
 

si t'as une methode virtuelle pure =0 dans A
cela implique que tu ne peux plus instancier la classe A.
Cela est un comportement normal etant donné que t'as pas donné de def pour ta methode.
 
Tu dois donc dans toute classe heritiere de A donner une def à la methode virtuelle si tu veux pouvoir instancier.
 
exemple
 
class A
{
public:
virtual void methodePurementVirtuelle(void)=0;
};
 
class B : public A
{
public:
virtual void methodePurementVirtuelle(void)
{
.......
}
};
 
et la tu peux ecrire A *unA = new B();


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  [C++] Héritage balaise!

 

Sujets relatifs
[C++] Question sur l'héritage[ CSS ] :: héritage de "classes"
Requete SQL sous Oracle Balaise ...[C++] help héritage
[asp][sql] Requête trop balaise à faire...[Delphi] - Question d'héritage (pour les pros)
Plus de sujets relatifs à : [C++] Héritage balaise!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR