J'ai le code suivant, où une classe de base définit une fonction virtuelle pure et la classe dérivée définit cette fonction virtuelle pure pour effectuer certains calculs avec la variable de membre privé de la classe de base Dans une perspective de conception, je lisais cela généralement, il est froncé sur le fait de faire Ceci a inspiré une deuxième question. Et si je voulais modifier var code> (
var code> ne sera pas modifié cependant).
var code> est généralement une grande structure.
var code> un membre protégé dans ce cas. Le meilleur moyen d'atteindre ce que je veux, c'est simplement passer
var code> comme argument dans
virtual_func () code>? P>
var code> dans
virtual_func code>? Cela changerait-il votre réponse? p>
3 Réponses :
Si vous ne voulez pas faire var code>
protégé code> dans la classe de base, vous pouvez ajouter un
public code> ou
protégé < / Code> Fonction Getter dans la base que vous pouvez ensuite appeler dans la classe dérivée.
Quelque chose comme
Ah oui, c'est une autre option. Je veux faire var code> protégé. Cela ferait ma vie vraiment facile, mais j'ai vu des ressources indiquant que c'est une mauvaise pratique. Toute opinion à ce sujet?
@Iamanon Si vous avez besoin de lire et de modifier var code> dans des classes dérivées mais je ne veux pas que les autres en dehors de la hiérarchie d'héritage y accédent, je dirais que c'est le cas d'utilisation parfait pour un
protégé code> variable membre.
Dans votre réponse, getvar () code> est une copie de
var code>, qui est apparemment une grande structure selon le QN. Il devrait être renvoyé via
const t & code> habituellement.
@iammilind J'ai dit "quelque chose comme". Que ce soit ou non par ( const code>), la référence ou la valeur est logique ici, je laisse jusqu'à OP.
"Dans une perspective de design, je lisais cela généralement, il est froncé sur le point de créer un membre protégé dans ce cas." em> p> blockQuote>
semble être une mauvaise notion de partout où vendez-vous. Si vous devez accéder à
base :: var code> dans
la classe dérivée code> alors la "décision" forte> meilleure décision de conception est de faire
var code> comme
protégé code> strong>. Tout le reste va déranger l'encapsulation. Quoi d'autre est le cas d'utilisation de
protégé code> autre que l'exigence mentionnée dans votre question. : -) p>
Bjarne STROSTRUP , dans son livre La conception et l'évolution de C ++ discute de Il a été ajouté précisément pour votre cas d'utilisation: permettre aux classes dérivées d'accéder aux membres de la classe de base, sans exposer ces membres à tout le monde, ni abuser de À la suite de ces directives, vous devez laisser toutes vos données de la classe de base Selon votre cas d'utilisation, et combien les données sont chères de copier, votre getter peut renvoyer une copie des données ou une référence (ou une référence constante). Le retour d'une référence non-Const vous permettrait de modifier les données directement via une affectation ( protégé code> à la section 13.9. P>
des déclarations code>. Cinq ans plus tard, la personne (projet) qui a apporté la demande interdit l'utilisation de variables des membres protégés, car ils sont devenus une source de bogues et de maintenance compliquée. Il conclut en disant que les données protégées n'étaient pas une bonne idée, mais les fonctions des membres protégées sont bien. P>
privé code> et ajouter
fonctions de getter et de réglage protégées pour accéder aux données. P>
getvar () = newvar; code>) ou pour modifier des membres de données spécifiques de la classe. Renvoyer une référence Const et utiliser une fonction de réglage, encapsulerait les données un peu plus sans exposer trop de la classe. La fonction Setter vous permettrait également de contrôler plus de modifications de
var code>, y compris de toute validation pouvant être requise. P>
Si vous souhaitez modifier
var code>, alors
protégé code> est votre choix, je ne vois pas pourquoi vous ne voudriez pas l'utiliser. Je veux dire, quand auriez-vous besoin d'utiliser ce mot-clé sinon? Parce que cela ressemble à vous refuser de l'utiliser dans le scénario spécifique qu'il a été conçu pour.