Bonjour, voici mon problème:
Dans le programme suivant tout fonctionne bien. La constructeur appelle
une fonction de la classe qui l'appelle.
class A
{
public:
void retour() { };
};
class C
{
public:
C::C( A *p);
private:
A *parent;
};
C::C( A *p ) : parent(p)
{
parent->retour();
}
void main()
{
A *a = new A();
C *c = new C(a);
}
Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour() de A
ou de B sans spécifier le nom de la classe parent dans le constructeur :
class A
{
public:
void retour() { };
};
class B
{
public:
void retour() { };
};
class C
{
public:
C::C( Generique *p);
private:
Generique *parent;
};
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Twxs
jean-luc Biord wrote:
Bonjour, bonjour
Voici ce que je voudrais réussir à faire: Avec une autre classe B, que C puisse appeller la fonction retour() de A ou de B sans spécifier le nom de la classe parent dans le constructeur :
il faut utiliser les methodes virtuelles
et faire heriter les classes A et B d'une classe commune (servant d'interface) ici nommee Generic possedant la methode retour.
class Generic{ public: virtual void retour() =0; };
le = 0 signifie que la methode est virtuelle pure i.e. chaque classe heritant de Generic *doit* implementer la methode retour. le mettre uniquement virtuelle permet de specifier un comportement par defaut.
class A : public Generic
{ public: void retour() { }; };
class B : public Generic
{ public: void retour() { }; };
class C { public: C::C( Generique *p); private: Generique *parent; };
void main() { A *a = new A(); B *b = new B(); C *c = new C(a); C *c2 = new C(b); }
Twxs
jean-luc Biord wrote:
Bonjour,
bonjour
Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour() de A
ou de B sans spécifier le nom de la classe parent dans le constructeur :
il faut utiliser les methodes virtuelles
et faire heriter les classes A et B d'une classe commune
(servant d'interface) ici nommee Generic possedant la methode
retour.
class Generic{
public:
virtual void retour() =0;
};
le = 0 signifie que la methode est virtuelle pure
i.e. chaque classe heritant de Generic *doit* implementer
la methode retour. le mettre uniquement virtuelle permet de
specifier un comportement par defaut.
class A
: public Generic
{
public:
void retour() { };
};
class B
: public Generic
{
public:
void retour() { };
};
class C
{
public:
C::C( Generique *p);
private:
Generique *parent;
};
Voici ce que je voudrais réussir à faire: Avec une autre classe B, que C puisse appeller la fonction retour() de A ou de B sans spécifier le nom de la classe parent dans le constructeur :
il faut utiliser les methodes virtuelles
et faire heriter les classes A et B d'une classe commune (servant d'interface) ici nommee Generic possedant la methode retour.
class Generic{ public: virtual void retour() =0; };
le = 0 signifie que la methode est virtuelle pure i.e. chaque classe heritant de Generic *doit* implementer la methode retour. le mettre uniquement virtuelle permet de specifier un comportement par defaut.
class A : public Generic
{ public: void retour() { }; };
class B : public Generic
{ public: void retour() { }; };
class C { public: C::C( Generique *p); private: Generique *parent; };
void main() { A *a = new A(); B *b = new B(); C *c = new C(a); C *c2 = new C(b); }
Twxs
drkm
Twxs writes:
jean-luc Biord wrote:
Voici ce que je voudrais réussir à faire: Avec une autre classe B, que C puisse appeller la fonction retour() de A ou de B sans spécifier le nom de la classe parent dans le constructeur :
il faut utiliser les methodes virtuelles et faire heriter les classes A et B d'une classe commune
Ca dépend. Le PO peut également employer un modèle de classe. Ses classes A et B ont elles réellement un lien de parenté ? D'après le nom qu'il donne à la classe dans l'illustration de ce qu'il veut faire, `Generique', je pencherais même plutôt pour le modèle de classe. Mais il n'y a que lui qui sait, pour l'instant.
Sinon, pour une idée du modèle de classe :
template< class Generique > class C { public: C::C( Generique * p ) ; private: Generique * parent ; } ;
Mais si tout cela t'est étranger (le PO), et les templates, et l'héritage, je te conseille d'investir un peu d'argent dans un bon bouquin C++ et un peu de temps dans sa lecture.
--drkm
Twxs <Twxs@free.fr> writes:
jean-luc Biord wrote:
Voici ce que je voudrais réussir à faire:
Avec une autre classe B, que C puisse appeller la fonction retour()
de A ou de B sans spécifier le nom de la classe parent dans le
constructeur :
il faut utiliser les methodes virtuelles
et faire heriter les classes A et B d'une classe commune
Ca dépend. Le PO peut également employer un modèle de classe. Ses
classes A et B ont elles réellement un lien de parenté ? D'après le
nom qu'il donne à la classe dans l'illustration de ce qu'il veut
faire, `Generique', je pencherais même plutôt pour le modèle de
classe. Mais il n'y a que lui qui sait, pour l'instant.
Sinon, pour une idée du modèle de classe :
template< class Generique >
class C
{
public:
C::C( Generique * p ) ;
private:
Generique * parent ;
} ;
Mais si tout cela t'est étranger (le PO), et les templates, et
l'héritage, je te conseille d'investir un peu d'argent dans un bon
bouquin C++ et un peu de temps dans sa lecture.
Voici ce que je voudrais réussir à faire: Avec une autre classe B, que C puisse appeller la fonction retour() de A ou de B sans spécifier le nom de la classe parent dans le constructeur :
il faut utiliser les methodes virtuelles et faire heriter les classes A et B d'une classe commune
Ca dépend. Le PO peut également employer un modèle de classe. Ses classes A et B ont elles réellement un lien de parenté ? D'après le nom qu'il donne à la classe dans l'illustration de ce qu'il veut faire, `Generique', je pencherais même plutôt pour le modèle de classe. Mais il n'y a que lui qui sait, pour l'instant.
Sinon, pour une idée du modèle de classe :
template< class Generique > class C { public: C::C( Generique * p ) ; private: Generique * parent ; } ;
Mais si tout cela t'est étranger (le PO), et les templates, et l'héritage, je te conseille d'investir un peu d'argent dans un bon bouquin C++ et un peu de temps dans sa lecture.