héritage c++ - C++ - Programmation
Marsh Posté le 28-08-2002 à 16:33:33
On peut pas instancier une classe abstraite.
Marsh Posté le 28-08-2002 à 16:43:44
ton choix devrait plutôt porter sur instancier un MotherFils1 ou un MotherFils2 ...
Marsh Posté le 28-08-2002 à 17:35:57
en fait voila exactement ce que je voudrai faire :
class mother
{
virtual void toto() = 0;
};
class MotherFils1 : public virtual mother
{
void toto()
{
printf("fils1\n" );
}
};
class MotherFils2 : public virtual mother
{
void toto()
{
printf("fils2\n" );
}
};
class A : public MotherFils1, public MotherFils2
{
};
int main(int argc, char* argv[])
{
return 0;
}
A la compilation j'ai cette erreur :
error C2250: 'A' : ambiguous inheritance of 'MotherFils1::toto'
error C2250: 'A' : ambiguous inheritance of 'MotherFils2::toto'
Ce que je voudrai c'est instancier "A" en spécifiant que "A" hérite de MotherFils1 (ou de MotherFils2 au choix)
Mais je crois, en effet, qu'il n'y a pas de solution possible ... à moins que qq1 ai une suggestion ...
Marsh Posté le 28-08-2002 à 17:43:22
Code :
|
La A hérite de MotherFils1 et de MotherFils2.
Si tu veus aucun pb il faut faire:
Code :
|
Marsh Posté le 28-08-2002 à 17:55:35
indice a écrit a écrit : Ce que je voudrai c'est instancier "A" en spécifiant que "A" hérite de MotherFils1 (ou de MotherFils2 au choix) Mais je crois, en effet, qu'il n'y a pas de solution possible ... à moins que qq1 ai une suggestion ... |
???????
Visiblement, Bjarne n'a pas conçu le C++ selon ta méthode de pensée
Tu veux faire quoi EXACTEMENT ? Une classe hérite d'une ou plusieurs classes mais c'est pas "au choix" (encore heureux, ça servirait à rien et ça serait inutilisable)
T'es sûr que tu n'es pas en train de vouloir réinventer le polymorphisme ?
Peut être veux tu simplement instancier une collection en vrac d'instances de MotherFils1 et de MotherFils2 et de pouvoir les utiliser indifféremment ? Si c'est le cas, la classe A ne sert à rien.
Marsh Posté le 28-08-2002 à 17:59:03
letoII a écrit a écrit :
|
ok, mais le pb lors de l'instanciation :
A a;
a.toto(); // <- ici "a" ne sais pas s'il faut appeler MotherFils1::toto() ou MotherFils2::toto()
En fait ce que je voudrai c'est avoir une classe mere "virtuelle" : c'est a dire avoir une classe mere qui peut changer au runtime. (en sachant que cette classe mere hérite elle meme d'une autre classe mere, sinon ca serai impossible à gérer pour le compilo).
Mais la je suis sur que c pas possible
en tout cas merci pour vos réponse ...
Marsh Posté le 28-08-2002 à 18:00:56
indice a écrit a écrit : En fait ce que je voudrai c'est avoir une classe mere "virtuelle" : c'est a dire avoir une classe mere qui peut changer au runtime. (en sachant que cette classe mere hérite elle meme d'une autre classe mere, sinon ca serai impossible à gérer pour le compilo). |
Pas possible l'héritage dynamique (c bien ça le terme?)
Marsh Posté le 28-08-2002 à 18:11:23
indice a écrit a écrit : ok, mais le pb lors de l'instanciation : A a; a.toto(); // <- ici "a" ne sais pas s'il faut appeler MotherFils1::toto() ou MotherFils2::toto() En fait ce que je voudrai c'est avoir une classe mere "virtuelle" : c'est a dire avoir une classe mere qui peut changer au runtime. (en sachant que cette classe mere hérite elle meme d'une autre classe mere, sinon ca serai impossible à gérer pour le compilo). |
Je crois qu'il faudrait que tu lises au moins un bouquin sur les méthodes de la conception objet avant de commencer à créer des hierarchies inutilement compliquées...
Marsh Posté le 28-08-2002 à 18:12:41
Smaragdus a écrit a écrit : ??????? Visiblement, Bjarne n'a pas conçu le C++ selon ta méthode de pensée Tu veux faire quoi EXACTEMENT ? Une classe hérite d'une ou plusieurs classes mais c'est pas "au choix" (encore heureux, ça servirait à rien et ça serait inutilisable) T'es sûr que tu n'es pas en train de vouloir réinventer le polymorphisme ? Peut être veux tu simplement instancier une collection en vrac d'instances de MotherFils1 et de MotherFils2 et de pouvoir les utiliser indifféremment ? Si c'est le cas, la classe A ne sert à rien. |
voila un exemple concret :
class objet3D //represente un objet en 3D que l'on peut deplacer
{
virtual dessinerObjet() = 0; //permet de dessiner l'objet
}
class velo : public objet3D //represente un velo
{
}
class objet3DpourCarteATI : public objet3D
{
dessinerObjet()
{
on dessine l'objet avec les fcction d'ATI
}
}
class objet3DpourCarteNVIDIA : public objet3D
{
dessinerObjet()
{
on dessine l'objet avec les fcction de nvdia
}
}
main()
{
Velo *v;
if(on_a_une_ATI)
{
v = new Velo; // et la je voudai dire que la class de base est objet3DpourCarteATI
}
else
{
v = new Velo; // et la je voudai dire que la class de base est objet3DpourCarteNVIDIA
}
}
et en effet j'ai l'impression de faire de la POO a ma maniere ...
mais bon, techniquement ca me semblai faisable, je pensai qu'il y avait une solution .....
Marsh Posté le 28-08-2002 à 18:21:58
indice a écrit a écrit : voila un exemple concret : class objet3D //represente un objet en 3D que l'on peut deplacer { virtual dessinerObjet() = 0; //permet de dessiner l'objet } class velo : public objet3D //represente un velo { } class objet3DpourCarteATI : public objet3D { dessinerObjet() { on dessine l'objet avec les fcction d'ATI } } class objet3DpourCarteNVIDIA : public objet3D { dessinerObjet() { on dessine l'objet avec les fcction de nvdia } } main() { Velo *v; if(on_a_une_ATI) { v = new Velo; // et la je voudai dire que la class de base est objet3DpourCarteATI } else { v = new Velo; // et la je voudai dire que la class de base est objet3DpourCarteNVIDIA } } et en effet j'ai l'impression de faire de la POO a ma maniere ... mais bon, techniquement ca me semblai faisable, je pensai qu'il y avait une solution ..... |
C'est incohérent ce que tu veux faire : tu vas pas tester la vérification de la CG à chaque fois que tu instancies ton objet Ou alors tu fais 2 classes VeloATI et VeloNvidia. Ou alors tu fais un template avec lequelle tu choisis une classes par carte. Il y a pleins de méthodes pour resoudre ça.
De plus, je vois pas comment objet3DpourCarteNvidia saurait quoi dessiner puisque l'implémentation du dessin s'effectuera dans les descendants.
Marsh Posté le 28-08-2002 à 18:23:34
Fait plutot une classe abstraite Renderer, avec deux sous classes RendererNVidia et RendererATI. Dans Renderer, définie une méthode draw (const Objet3D *), qui doit être surchargée dans les sous classes.
Au final, ton main devient :
Code :
|
Marsh Posté le 28-08-2002 à 18:31:06
Smaragdus a écrit a écrit : C'est incohérent ce que tu veux faire : tu vas pas tester la vérification de la CG à chaque fois que tu instancies ton objet |
l'objet est instancié une fois pour toute au debut ....
[citation]
Ou alors tu fais 2 classes VeloATI et VeloNvidia. Ou alors tu fais un template avec lequelle tu choisis une classes par carte. Il y a pleins de méthodes pour resoudre ça.
[/citation]
Le pb avec cette méthode c'est que si je veux creer une classe de type voiture, je suis obligé de créer voitureATI et voitureNvidia, (alors que si ma méthode avait été possible j'avais juste à creer une class voiture)
[citation]
De plus, je vois pas comment objet3DpourCarteNvidia saurait quoi dessiner puisque l'implémentation du dessin s'effectuera dans les descendants.
[/citation]
"l'implementation du dessin" justement ce trouve dans objet3DpourCarteNvidia::dessinerObjet()
et cette methode est appelé de cette maniere objet3d::dessinerObjet()
en tout cas mer6 pour tes réponses
Marsh Posté le 28-08-2002 à 18:35:05
indice a écrit a écrit : "l'implementation du dessin" justement ce trouve dans objet3DpourCarteNvidia::dessinerObjet() et cette methode est appelé de cette maniere objet3d::dessinerObjet() |
C'est bien ce que je disais, c'est incohérent puisque si le dessin est dans objet3DpourCarteNvidia:: dessinerObjet(), Velo:: dessinerObjet() sert à quoi ?
Marsh Posté le 28-08-2002 à 18:43:10
Smaragdus a écrit a écrit : C'est bien ce que je disais, c'est incohérent puisque si le dessin est dans objet3DpourCarteNvidia:: dessinerObjet(), Velo:: dessinerObjet() sert à quoi ? |
Velo:: dessinerObjet() n'existe parce que Velo ne contient pas les donnée 3D (triangles etc ...)
C'est justement objet3D qui contient ces données
et qd j'appel la méthode objet3D::dessinerObjet c'est l'objet objet3DpourCarteNvidia qui dessiner les triangles a partir des données contenu dans objet3D (sa classe mere)
Marsh Posté le 28-08-2002 à 20:40:37
tu veux pouvoir choisir à l'instanciation de dériver de fils1 ou fils2...utilise les templates!
template <class I>
class interface: public I
{
}
class CPere
{
//que des méthodes virtuelles (mais pas virtuelles pur) rédéfinies dans Fils1 et Fils2)
}
class CFils1 : public CPere, public interface<CMotherFils1>
{
}
class CFils2 : public CPere, public interface<CMotherFils2>
{
}
évidemment MotherFils2/1 dérive de Mother
voici le schéma correspondant :
Mother
|
|
MotherFils1/2
|
|
interface Pere
|
|
Fils1/2
A l'instanciation :
CPere* fils[2];
fils[0]=new CFils1();
fils[1]=new CFils2();
jamais testé mais ça devrait marcher, (c'est possible que l'héritage multiple ne soit pas supporté pour les classes dérivant déjà d'une classe templates...à vérifier)
Marsh Posté le 30-08-2002 à 03:04:04
Ça peut se faire comme ça:
Code :
|
Mais je suis d'accord avec tout le monde que c'est pas une bonne approche.
Je pense plutôt à ça:
Code :
|
Mais c'est pas terrible non plus.
render pourrait être tout simplement un pointeur de fonction.
Marsh Posté le 30-08-2002 à 10:22:44
bon la je suis dans le pate donc si je radote fo pas m'en vouloir.
le truc a faire :
Code :
|
Voila au erreurs de claviers pres.
C'est + propre non ??
De toute maniére tu va etre obligé de tester le type de carte avant d'instancier les trucs ...
Marsh Posté le 30-08-2002 à 10:25:39
Joel F a écrit a écrit : bon la je suis dans le pate donc si je radote fo pas m'en vouloir. le truc a faire :
|
M'excuse apr avance pour le petit pourrissage de topic: J'avais po vu la signature
Marsh Posté le 28-08-2002 à 16:29:49
class mother
{
virtual void toto() = 0;
}
class A : public class mother
{
}
class MotherFils1 : public class mother
{
void toto()
{
}
}
class MotherFils2 : public class mother
{
void toto()
{
}
}
les classes "mother" et "A" sont abstraite.
j'aimerai instancier la classe "A" en spécifiant que sa classe mere est (au choix)"MotherFils1" (ou "MotherFils2" )
c'est possible ?
(j'espere que je suis pas trop flou )
merci