Héritage balaise! [C++] - Programmation
Marsh Posté le 30-08-2001 à 18:45:20
ben kess tu dis, c'est la définition même de l'héritage ?
kess li marche pas ?
ça compile pas ?
Marsh Posté le 30-08-2001 à 19:19:07
en effet, ca devrait passer.
Si ca passe pas, essaye de faire un casting:
Process((A *) &Objet2);
Process((A *) &Objet3);
Marsh Posté le 30-08-2001 à 19:21:05
heu... si ça passe pas tel-quel, j'arrête tout et je pars élever des chèvres dans le lubéron !
Marsh Posté le 30-08-2001 à 19:22:41
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 ?
Marsh Posté le 30-08-2001 à 19:32:30
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.
Marsh Posté le 30-08-2001 à 22:21:59
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?
Marsh Posté le 30-08-2001 à 23:52:41
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.
Marsh Posté le 31-08-2001 à 10:01:34
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...
Marsh Posté le 31-08-2001 à 10:26:02
C'est pas un problème balaise d'heritage... je suis déçu.
Marsh Posté le 01-09-2001 à 17:50:27
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?
Marsh Posté le 01-09-2001 à 19:59:24
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();
Marsh Posté le 30-08-2001 à 17:31:32
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?