- Si toutes les instances de toutes les classes dérivées partagent les mêmes données à la virgule près, rendre le membre static et le placer dans la classe mère
- Si toutes les instance d'une classe dérivée particulière partagent les même données à la virgule près, tu peux le rendre static et le placer dans la classe dérivée (*)
- Si chaque instance d'une classe dérivée particulière dispose de ses propres données qui sont (potentiellement) différente d'une autre instance de la même classe dérivée le membre ne doit pas être static (**)(***)(****)
(*)Si, pour une raison ou une autre, tu dois pouvoir accéder à cet élément commun à toutes les instances d'une classe dérivée particulière depuis une instance d'objet qui "passerait pour être" du type de la classe mère (polymorphisme sur le comportement inside

), l'idéal est de rajouter une fonction virtuelle pure dans la classe mère (car il te serait impossible de fournir un comportement cohérent dans la classe mère

) et de l'implémenter dans toutes les classes filles afin qu'elle fournissent l'accès aux données en question.
(**) Il faut alors réfléchir au besoin éventuel de disposer de ces informations depuis un objet de type dérivé "passant pour etre" du type de la classe mère:
Si la gestion des dites données peut décemment être considéré comme l'une des responsabilités de la classe mère, tu peux envisager de placer l'élément dans la classe mère et y rajouter également les comportement de gestion (quitte à les rendre protégés pour que seules les fonctions des classes dérivées puissent y accéder).
(***)Si la responsabilité de la gestion de l'élément ne peut décemment pas être considérée comme "faisant partie de la responsabilité" de la classe mère, mais que l'on doit pouvoir y accéder depuis tout élément passant pour être du type de la classe mère, on repart sur l'idée d'un comportement polymorphe déclaré au niveau de la classe mère, implémenté dans les classes filles.
(****)Si tu ne dois jamais accéder à cet élément depuis un objet "passant pour etre" du type de la classe mère, places cet élément (et tous les comportements qui en concernent la gestion éventuelle) dans les classes dérivées, quitte, si tu envisage de gérer les objets de tes classes filles avec des fonctions (ou des classes) génériques (template) à veiller à ce que les noms soient identiques dans toutes les classes dérivées (*****).
(*****) Dans ce cas particulier (et, de manière générale, si toutes les classes filles doivent avoir un élément particulier identique, mais qui n'a rien à voir avec la classe mère), il est possible (merci C++ de nous permettre cela

) d'envisager de créer deux interfaces différentes, et d'utiliser l'héritage multiple:
Une interface "classique" (non template, avec fonctions virtuelles si besoin, et tout le paradigme OO à la rescousse) pour la classe mère et une interface template (avec comme paramètre template le type de la classe dérivée) qui apporte "juste le comportement adéquat" supplémentaire, sous une forme proche de
Mais, dans quelle situation te trouves-tu

Partager