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

 


Dernière réponse
Sujet : [C++] Héritage balaise!
aqwsezsxdr 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();

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
aqwsezsxdr 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();
bkadoum 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?
n0mad C'est pas un problème balaise d'heritage... je suis déçu.
BENB

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...

aqwsezsxdr 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.
bkadoum 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?
minusplus 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.
youdontcare 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 ?
minusplus heu... si ça passe pas tel-quel, j'arrête tout et je pars élever des chèvres dans le lubéron !
SoWhatIn22 en effet, ca devrait passer.
Si ca passe pas, essaye de faire un casting:
 
Process((A *) &Objet2);
Process((A *) &Objet3);
minusplus ben kess tu dis, c'est la définition même de l'héritage ?
 
kess li marche pas ?
 
ça compile pas ?
bkadoum 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?

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)