question POO : "double héritage"

Ou : "comment déclarer des attributs de sous-classe dans la classe mère, sachant que le sur-type de ces attributs correspond à une autre sur-classe ?"

a marqué ce sujet comme résolu.

Bonjour,

Je me remets à la programmation objet en ces temps de confinement (je remercie d’ailleurs les auteurs du cours C++ qui est excellent), et j’ai une question conceptuelle ; un diagramme parlera mieux :

Ma question est la suivante. Dans les classes Fille1 et Fille2, j’ai des attributs att respectivement de type B1 et B2, sous-types de A. Je les définis directement dans ces sous-classes, mais il me semble que je perds des informations :

  1. Je souhaite que att soit défini dans toutes les classes héritées de Mère
  2. Je souhaite que att ait pour sur-type A, et pas n’importe quoi d’autre

Ce qui me conduit à penser qu’il faut définir att dans la classe mère. Mais comment alors le préciser dans les sous-classes ? Peut-on le "redéfinir" en C++ ?

Merci d’avance,

Michel

+0 -0

Salut,

Au risque de dire une bêtise car mon C++ est un peu rouillé, si tu définis un attribut avec la visibilité protected dans la classe mère (plutôt que private), tu peux le manipuler directement depuis tes classes filles. L’héritage modélise la relation "EST UN" : si B hérite de A, alors B EST UN A, et donc B possède les mêmes attributs que A. Ton problème n’est donc pas que des infos sont perdues, mais il semble plutôt être que tu veux manipuler les attributs hérités depuis les classes filles.

+1 -0

Lu’!

Pour ça, tu n’as pas d’autre choix que d’avoir un pointeur (intelligent) ou une référence dans ton type de base, sinon tu ne pourrais pas avoir de polymorphisme sur cette variable.

Pour ce qui est des accès à cette variable, généralement, on préfère éviter d’avoir une variable membre protected (risque de casser les invariants depuis les classes enfant, tout ça). Donc difficile d’aller plus loin sans savoir ce que tu veux faire un peu plus concrètement.

Mon idée au départ était plus une curiosité qu’une volonté de faire quelque chose de concret mais voici un exemple (pas forcément pertinent et limite caricatural)

Je souhaite que chaque sous-classe de Personne possède un attribut "hobby", ce qui m’amène à définir hobby dans la classe mère.

Mais ce n’est pas suffisant, car je souhaite aussi qu’il y ait une sorte de couplage entre les attributs des sous-classes de Personne et celles de Hobby. Autrement dit, qu’une personne Jeune ne peut avoir qu’un hobby de type Sport, une personne Retraitée un hobby JeuDeCartes. Ce pourquoi j’ai précisé cela dans les sous-classes. Et la question était de savoir si l’on pouvait redéfinir ces attributs de cette façon, dans les classes héritées.

Plus j’avance et plus je me dis que ce double héritage n’est peut-être pas le schéma idéal

J’espère avoir été plus clair par cet exemple.

Pour ça, tu n’as pas d’autre choix que d’avoir un pointeur (intelligent) ou une référence dans ton type de base, sinon tu ne pourrais pas avoir de polymorphisme sur cette variable.

Ksass`Peuk

Je vais essayer d’explorer cette idée, merci

+0 -0

Ok, donc ton problème vient quelque part du fait que c’est précisément pas une bonne manière d’utiliser de l’héritage ici ;) .

L’important dans une classe c’est les fonctions qu’elle propose, pas les données qu’elle contient (qui sont secondaires et juste un moyen de fournir les fonctionnalités). Tel que tu présentes ton code, ce qu’on se dit immédiatement c’est : l’héritage au niveau des Personne n’est pas utile puisqu’il n’y a pas de différence de service rendu (puisqu’il n’y a pas de service).

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte