Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Héritage multiple et appel de fonction

9 réponses
Avatar
Benoit Rousseau
Sur la hierarchy de classe suivante :

class Shape{
public:
virtual ~Shape() {};
virtual void within() = 0;
};

class Circle : public Shape {
public:
void within() { cout << "hello"; }
};

class ArenaObject {
public:
virtual ~ArenaObject () {};
};

class MovingObject : public Circle, public ArenaObject {};

int main() {
ArenaObject* r1 = new MovingObject;

((Shape*)r1) -> within();

};

Comment faire pour que r1 (qui dérive à la fois de ArenaObject et de
Shape<|-Circle ) puisse appeler within() de Circle.

Le code précedent génére un SegFault (gcc).

Je ne veux bien sûr pas déclarer r1 comme Shape* puisqu'il est stocké
dans une liste de ArenaObject...


--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/

9 réponses

Avatar
Jean-Marc Bourguet
Benoit Rousseau writes:

Sur la hierarchy de classe suivante :

class Shape{
public:
virtual ~Shape() {};
virtual void within() = 0;
};

class Circle : public Shape {
public:
void within() { cout << "hello"; }
};

class ArenaObject {
public:
virtual ~ArenaObject () {};
};

class MovingObject : public Circle, public ArenaObject {};

int main() {
ArenaObject* r1 = new MovingObject;

((Shape*)r1) -> within();
dynamic_cast<Shape*>(r1)->within();


};


A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Benoit Rousseau
Jean-Marc Bourguet wrote:
Benoit Rousseau writes:
class Shape{
public:
virtual ~Shape() {};
virtual void within() = 0;
};

class Circle : public Shape {
public:
void within() { cout << "hello"; }
};

class ArenaObject {
public:
virtual ~ArenaObject () {};
};

class MovingObject : public Circle, public ArenaObject {};

int main() {
ArenaObject* r1 = new MovingObject;

((Shape*)r1) -> within();


dynamic_cast<Shape*>(r1)->within();
Hmmm, il me semblait pourtant l'avoir testé aussi... Peut être que

l'erreur vennait d'ailleur à ce moment là...

Au fait, je ne comprends pas trop bien le reinterpret_cast...


--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/


Avatar
Thomas Parle
"Benoit Rousseau" a écrit dans le message de news:
3fcc9b2b$0$3239$
Jean-Marc Bourguet wrote:
Benoit Rousseau writes:

int main() {
ArenaObject* r1 = new MovingObject;

((Shape*)r1) -> within();


dynamic_cast<Shape*>(r1)->within();
Hmmm, il me semblait pourtant l'avoir testé aussi... Peut être que

l'erreur vennait d'ailleur à ce moment là...

Au fait, je ne comprends pas trop bien le reinterpret_cast...


Ou ça un reinterpret_cast ?
Sinon, je pencherais plutôt pour un pb de conception : stocker ton objet en
tant que ArenaObject sous entend qu'il ne sera considéré qu'à travers les
fonctionnalités de base de la classe ArenaObject. Rien n'assure que ton
objet ne soit aussi un Shape*. Mais sans en savoir plus sur le code en
question, je ne peux vraiment avoir d'avis pertinent sur la question, je
veux juste donner moin point de vue d'après ce que j'en voit.
Bon courage



Avatar
Benoit Rousseau
Thomas Parle wrote:
"Benoit Rousseau" a écrit dans le message de news:
3fcc9b2b$0$3239$

Jean-Marc Bourguet wrote:

Benoit Rousseau writes:




int main() {
ArenaObject* r1 = new MovingObject;

((Shape*)r1) -> within();


dynamic_cast<Shape*>(r1)->within();


Hmmm, il me semblait pourtant l'avoir testé aussi... Peut être que
l'erreur vennait d'ailleur à ce moment là...

Au fait, je ne comprends pas trop bien le reinterpret_cast...



Ou ça un reinterpret_cast ?
Null part... Juste pour savoir.


Sinon, je pencherais plutôt pour un pb de conception : stocker ton objet en
tant que ArenaObject sous entend qu'il ne sera considéré qu'à travers les
fonctionnalités de base de la classe ArenaObject. Rien n'assure que ton
objet ne soit aussi un Shape*. Mais sans en savoir plus sur le code en
question, je ne peux vraiment avoir d'avis pertinent sur la question, je
veux juste donner moin point de vue d'après ce que j'en voit.
Bon courage



En fait j'ai modifier ce design à cause d'objets tels que les murs.
J'hésitais (et hésite toujours).

La solution précédente était de dériver Circle, Line et InnerCircle de
Shape, puis WallCircle, WallLine et InnerCircle de chacune de ces trois
classes.
De Circle dérivait tous les autres objets d'une arène.

Le problème vient du fait que pour redéfinir un mur, il faut modifier
les 3 classes, et pour faire des murs configurables, ça devient impossible.

J'ai donc pensé à ajouter une autre classe de base ArenaObject.
D'elle viennent les définitions suivantes :
class Wall : ArenaObject;
class WallCircle : Wall, Circle;
class MovingObject : ArenaObject, Circle
class Robot : MovingObject

Est ce qu'une composition te semble plus appropriée ?
class ArenaObject {
protected:
Shape* my_shape;
}; ?








--
--------------------------------------------
Benoît Rousseau : roussebe at spray dot se
Jouez en programmant : http://realtimebattle.sourceforge.net/




Avatar
Thomas Parle
"Benoit Rousseau" a écrit dans le message de news:
3fccabd9$0$2837$

En fait j'ai modifier ce design à cause d'objets tels que les murs.
J'hésitais (et hésite toujours).

La solution précédente était de dériver Circle, Line et InnerCircle de
Shape, puis WallCircle, WallLine et InnerCircle de chacune de ces trois
classes.
De Circle dérivait tous les autres objets d'une arène.


Si je comprends bien, Shape = forme de base, spécialisées en Circle, Line,
etc
ArenaObject = manifestation physique dans ton monde (apparemment un niveau
style Quake3 ? :)) d'une forme (Shape) donnée.


Le problème vient du fait que pour redéfinir un mur, il faut modifier
les 3 classes, et pour faire des murs configurables, ça devient
impossible.


J'ai donc pensé à ajouter une autre classe de base ArenaObject.
D'elle viennent les définitions suivantes :
class Wall : ArenaObject;
class WallCircle : Wall, Circle;
class MovingObject : ArenaObject, Circle
class Robot : MovingObject

Est ce qu'une composition te semble plus appropriée ?
class ArenaObject {
protected:
Shape* my_shape;
}; ?


Oui, c'est bien meilleur : en effet, ce que tu appelles ArenaObject
correspond à l'incarnation physique d'un modèle mathématique de tes formes
(définies par la classe Shape si c'est ce que je crois). Un ArenaObject est
une représentation possible que l'on peut créer à partir d'un objet Shape,
mais lui-même n'est pas un Shape : une maison comme tu la vois en vrai n'est
pas un plan spécial de celle-ci, c'est une chose concrète construite d'après
les plans de l'architecte. La composition est ici le meilleur choix :
cohérent, et plus souple. De plus, quand tu peux te passer de l'héritage
c'est tant mieux (combien de fois ai-je vu des programmeurs qui se servaient
de l'héritage pour se servir des fonctionnalités d'un objet, la conception
était affreuse, une fois j'ai même vu la classe CApplication qui
dérivait...d'une classe Camera !...).

Avatar
Zouplaz
Thomas Parle - :

La composition est ici le meilleur choix : cohérent, et plus souple.


Est-ce ce qu'on appelle un objet "composite" dans ce cas ? Ca serait la
traduction de "composition" ou bien me goure-je ?

Avatar
Thomas Parle
"Zouplaz" a écrit dans le message de news:

Thomas Parle - :

La composition est ici le meilleur choix : cohérent, et plus souple.


Est-ce ce qu'on appelle un objet "composite" dans ce cas ? Ca serait la
traduction de "composition" ou bien me goure-je ?


oui, Composite = susceptible d'être contenu dans un Composant. On utilise
souvent ces termes en référence au pattern Composant/Composite que je
t'invite à voir sur le net si tu ne le connais pas.


Avatar
Zouplaz
Thomas Parle - :

"Zouplaz" a écrit dans le message de news:

Thomas Parle - :

La composition est ici le meilleur choix : cohérent, et plus souple.


Est-ce ce qu'on appelle un objet "composite" dans ce cas ? Ca serait la
traduction de "composition" ou bien me goure-je ?


oui, Composite = susceptible d'être contenu dans un Composant. On utilise
souvent ces termes en référence au pattern Composant/Composite que je
t'invite à voir sur le net si tu ne le connais pas.





C'est marrant, j'aurais cru que le composite c'est celui qui contenait des
composants...



Avatar
Thomas Parle
"Zouplaz" a écrit dans le message de news:

Thomas Parle - :

C'est marrant, j'aurais cru que le composite c'est celui qui contenait des
composants...


euh...tout à fait ! (pardon pour l'étourderie ;-) )