OVH Cloud OVH Cloud

(Newbie) Héritage et polymorphisme

27 réponses
Avatar
patrice brassard
Je suis débutant et étudiant en C++ et je ne m'aîtrise pas tellement les
bases. J'ai beau regarder dans mes bouquins, je me bute à un mur. Voilà que
j'ai un exercice à faire et je sollicite votre aide.

1)
Je dois écrire un programme qui définit une classe Point, et 2 classes qui
hérite de Point, Carré et Cube.

2)
L'exercice doit également être fait selon la Composition.

SVP. Aidez-moi !

Merci !

10 réponses

1 2 3
Avatar
Loïc Joly
Je suis débutant et étudiant en C++ et je ne m'aîtrise pas tellement les
bases. J'ai beau regarder dans mes bouquins, je me bute à un mur. Voilà que
j'ai un exercice à faire et je sollicite votre aide.

1)
Je dois écrire un programme qui définit une classe Point, et 2 classes qui
hérite de Point, Carré et Cube.


Ce type d'utilisation de l'héritage est probablement une mauvaise idée.
Mais il faudrait une description plus détaillée du problème pour le
confirmer.


2)
L'exercice doit également être fait selon la Composition.


Montre nous ce que tu as fait, là où ça bloque, et on t'aidera. Nous ne
sommes pas ici pour faire des devoirs à ta place.


--
Loïc

Avatar
Fabien LE LEZ
On Tue, 2 Aug 2005 18:59:31 -0400, "patrice brassard"
:

Je dois écrire un programme qui définit une classe Point, et 2 classes qui
hérite de Point, Carré et Cube.


Gloups... Tu veux dire qu'un Carré est un cas particulier de Point ?
Soit il y a un souci quelque part, soit les noms sont très mal
choisis.

Avatar
Stan
"Fabien LE LEZ" a écrit dans le message de news:

On Tue, 2 Aug 2005 18:59:31 -0400, "patrice brassard"
:

Je dois écrire un programme qui définit une classe Point, et 2 classes qui
hérite de Point, Carré et Cube.


Gloups... Tu veux dire qu'un Carré est un cas particulier de Point ?
Soit il y a un souci quelque part, soit les noms sont très mal
choisis.



class figure_geometrique { };
class carre : public figure_geometrique {};

Je ne dirais pas que carre est un cas particulier de figure_geometrique.
Mais bon, c'est une affaire de vocabulaire.
--
-Stan


Avatar
Fabien LE LEZ
On Wed, 3 Aug 2005 11:04:01 +0200, "Stan" (
remove the dots )>:

Je ne dirais pas que carre est un cas particulier de figure_geometrique.


Pourtant, en géométrie, un carré est bien un cas particulier de figure
géométrique.

Avatar
Stan
"Fabien LE LEZ" a écrit dans le message de news:

On Wed, 3 Aug 2005 11:04:01 +0200, "Stan" (
remove the dots )>:

Je ne dirais pas que carre est un cas particulier de figure_geometrique.


Pourtant, en géométrie, un carré est bien un cas particulier de figure
géométrique.


Si l'on considère que dans l'héritage, toutes classes descendantes est un
cas particulier,
cela ne nous avance pas beaucoup sur la nature de l'héritage.

La classe Point peut être:
class Point{
public:
// ...
virtual void show( );
virtual void setpos( int x, int y );
};

et Carre :

class Carre : public Point{
public:
virtual void show( ); // affiche les 4 droite
virtual void setpos( int x, int y ); // initialise le centre du carre ou
le coin haut/droit
};

D'un point de vue "géométrique" un carré n'est pas vraiment un cas
particulier de point,
pourtant, ce type de relation ( Point : Carre ) n'est pas une hérésie.

--
-Stan


Avatar
Jean-Marc Bourguet
"Stan" ( remove the dots )> writes:

D'un point de vue "géométrique" un carré n'est pas vraiment un cas
particulier de point,
pourtant, ce type de relation ( Point : Carre ) n'est pas une hérésie.


Si tu te places sur le plan religieux (je veux dire dans l'optique
d'un respect absolu et irreflechi d'une certaine methodologie de
conception), c'est une heresie: on n'herite pas d'une classe concrete
et Point en est une.

Je ne suis pas un adversaire fanatique de l'heritage de classes
concretes; mais il faut savoir ce que ca apporte quelque chose parce
que ce genre de regles n'est pas sans fondements. Ici ca introduit
surtout une dissymetrie entre Point et les autres figures (Carre*,
Cercle, Groupe, ...) et je ne vois pas aucun apport. Elle va gener
tot ou tard (par exemple quand on va chercher a ajouter un visiteur
sur les figures). Il me semble par contre tres naturel que Carre et
Point heritent de Figure.

(*) En fait, je n'aurais vraissemblablement pas de classe Carre mais
simplement une classe Rectangle que j'utiliserais aussi pour les
carres (mais tout depend du contexte, en particulier si on a les deux
-- Carre et Rectangle -- faut-il que Carre herite de Rectangle? --
apres tout un Carre *est un* Rectangle -- que Rectangle herite de
Carre? -- apres tout il lui faut un champs de moins -- qu'ils soient
independants?, a moins qu'avoir un mecanisme plus general de
contraintes et qu'il n'y ait pas de Carre mais simplement des
Rectangle contraints ne soit reellement la solution?).

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
Stan
"Jean-Marc Bourguet" a écrit dans le message de news:

"Stan" ( remove the dots )> writes:

D'un point de vue "géométrique" un carré n'est pas vraiment un cas
particulier de point,
pourtant, ce type de relation ( Point : Carre ) n'est pas une hérésie.


Si tu te places sur le plan religieux (je veux dire dans l'optique
d'un respect absolu et irreflechi d'une certaine methodologie de
conception), c'est une heresie: on n'herite pas d'une classe concrete
et Point en est une.

Tu es bien trop dogmatique ;-) on n'hérite _rarement_ d'une classe concrete.


Je ne suis pas un adversaire fanatique de l'heritage de classes
concretes; mais il faut savoir ce que ca apporte quelque chose parce
que ce genre de regles n'est pas sans fondements. Ici ca introduit


Quand on est à l'origine de la conception, on utilisera certainement une
classe
de base abstraite, mais en tant qu'utilisateur ça peut dépanner, même si ce
n'est pas
sans inconvénients.

--
-Stan


Avatar
JBB
"Stan" ( remove the dots )> writes:


D'un point de vue "géométrique" un carré n'est pas vraiment un cas
particulier de point,
pourtant, ce type de relation ( Point : Carre ) n'est pas une hérésie.



Si tu te places sur le plan religieux (je veux dire dans l'optique
d'un respect absolu et irreflechi d'une certaine methodologie de
conception), c'est une heresie: on n'herite pas d'une classe concrete
et Point en est une.

Je ne suis pas un adversaire fanatique de l'heritage de classes
concretes; mais il faut savoir ce que ca apporte quelque chose parce
que ce genre de regles n'est pas sans fondements. Ici ca introduit
surtout une dissymetrie entre Point et les autres figures (Carre*,
Cercle, Groupe, ...) et je ne vois pas aucun apport. Elle va gener
tot ou tard (par exemple quand on va chercher a ajouter un visiteur
sur les figures). Il me semble par contre tres naturel que Carre et
Point heritent de Figure.

(*) En fait, je n'aurais vraissemblablement pas de classe Carre mais
simplement une classe Rectangle que j'utiliserais aussi pour les
carres (mais tout depend du contexte, en particulier si on a les deux
-- Carre et Rectangle -- faut-il que Carre herite de Rectangle? --
apres tout un Carre *est un* Rectangle -- que Rectangle herite de
Carre? -- apres tout il lui faut un champs de moins -- qu'ils soient
independants?, a moins qu'avoir un mecanisme plus general de
contraintes et qu'il n'y ait pas de Carre mais simplement des
Rectangle contraints ne soit reellement la solution?).

A+

Moi je vois bien ça comme suit ( d'apres mes restes en geométrie)

(derivation -> spécialisation)

FormeGeometrique
/
|
|
Poygone
/
|
|
Quadrilatere
/
|
|
Rectangle
/
|
|
Carre

là ou ça se complique c'est si je rajoute Losange

Quadrilatere
/
|
|
|---Rectangle
|
|---Losange

comme un Carre est à la fois un Rectange et un Losange je ne sais plus
quoi faire de Carre. double héritage ...?

ou un truc du genre (les classes en I sont des interfaces (classes
abstraites))


IFormeGeometrique
/
|
|
IPoygone
/
|
|
IQuadrilatere
/
|
|
|---IRectangle<-------
| / |
| | |
| Rectangle Carre
| |
| |
|---ILosange<---------|
/
|
Losange


Avatar
Loïc Joly
(*) En fait, je n'aurais vraissemblablement pas de classe Carre mais
simplement une classe Rectangle que j'utiliserais aussi pour les
carres (mais tout depend du contexte, en particulier si on a les deux
-- Carre et Rectangle -- faut-il que Carre herite de Rectangle? --
apres tout un Carre *est un* Rectangle


Pas trop au sens LSP (et essentialiste) du terme être. On peut appliquer
à un rectangle des opérations qui n'ont pas de sens sur un carré. Par
exemple setRatio.

-- que Rectangle herite de
Carre? -- apres tout il lui faut un champs de moins --


J'ai un peu de mal à voir la vertue de cette approche purement basée sur
l'implémentation. Et puis, que signifie une fonction setCôté pour un
rectangle ?



qu'ils soient
independants?, a moins qu'avoir un mecanisme plus general de
contraintes et qu'il n'y ait pas de Carre mais simplement des
Rectangle contraints ne soit reellement la solution?).


J'avais vu une autre proposition que j'avais trouvée sympa :

Faire une classe RectangleConstant dont dérive Carré (ou CarréConstant
puis Carré) et Rectangle.


--
Loïc

Avatar
Fabien LE LEZ
On Wed, 3 Aug 2005 14:20:46 +0200, "Stan" :

D'un point de vue "géométrique" un carré n'est pas vraiment un cas
particulier de point,
pourtant, ce type de relation ( Point : Carre ) n'est pas une hérésie.


Je trouve cette hiérarchie très perturbante, et franchement, je me
refuserais à l'implémenter.

Maintenant, est-ce une hérésie ? Je ne sais pas.

Mais note que ça peut être dangereux.

Ainsi, la fonction

bool Disjoints (Carre const&, Point const&);

est très vraisemblablement incorrecte si elle n'est pas accompagnée
d'une fonction

bool Disjoints (Carre const&, Carre const&);

1 2 3