un moyen en C ++ pour cacher une fonction spécifique
j'ai un héritage struct A : public B
je veux masquer des fonctions de B, est-ce possible?
je sais que l'inverse est possible à l'aide de using BMethod
dans la déclaration.
acclamations
source d'informationauteur lurscher
Vous devez vous connecter pour publier un commentaire.
Il y a un problème ici: ce serait une violation directe du Principe de Substitution de Liskov, à savoir
A
ne serait pas agir comme unB
plus.Si vous souhaitez réutiliser
B
mise en œuvre, la solution est tout simplement de le faire:Ne pas abuser de l'héritage, de l'utilisation de la composition à la place
Si vous voulez vous cachez des fonctions de B, il ne fait pas beaucoup de sens pour l'utilisation publique de succession dans la première place.
L'utilisation privée de l'héritage & sélectivement apporter des méthodes de B dans le champ d'application d'Un:
De côté à partir de la façon décrite dans la réponse à la question précédente—composition, privé de l'héritage, et non privée, héritage, mais avec la méthode héritée déclaré privé—une autre façon est explicitement
delete
la méthode héritée:Bien que le
b.foo()
appel produit une erreur de compilation, le code client peut encore appeler la classe de base de la version en se qualifiant à la base de l'identificateur de classeA
:Explicitement la suppression fonctionne quand
foo
est pas un quasi non-méthode de suppression dansA
. En C++11 §10.3/16, cette suppression explicite est mal formé lorsque la méthode de suppression dans la classe dérivée remplace un quasi non-méthode de suppression de la classe de base. Pour plus d'informations sur cette restriction, voir les réponses à la question C++11 Supprimer Surchargée De La Méthode.Vous ne pouvez pas "cacher" en soi, mais vous pouvez faire une erreur de compilation à l'appeler. Exemple:
Exemples sur codepad avec l'erreuret sans.
Que tout est dit, si c'est possible, vous ne devriez pas le faire. Vous aurez confondre l'enfer hors de clients.
EDIT: Notez que vous pouvez aussi le faire avec fonctions virtuelles (Et avec l'erreur).
À ceux qui le sont, ce qui suggère la composition... cela pourrait ne pas être la meilleure façon d'aller sur les choses. Ma compréhension est que le Principe de Substitution de Liskov précise seulement qu'il y a la possibilité de les fonctions de la classe de base utilisée sur l'enfant, non pas qu'ils nécessairement devrait être. Par exemple, pour une classe de base, vous pouvez avoir plusieurs fonctions essentiellement à effectuer la même opération, mais pour d'autres cas spécifiques. Dans la classe dérivée, vous voudrez peut faire abstraction de ces fonctions publiques, l'écart en faveur de la simplification de l'interface utilisateur. C'est là privé de l'héritage peut être utilisé. Privé de l'héritage peut également être une nécessité, si nous avons des fonctions protégées dans la classe de base que nous ne voulons pas que l'utilisateur de la classe de base pour appeler, mais serait d'une valeur inestimable pour la classe dérivée.
En bref, si vous devez, l'utilisation privée de l'héritage, mais la composition est préféré dans la plupart des cas.
Si les méthodes sont privés dans B, puis ils vont rester caché pour un même si vous utilisez le transport en héritage.
Il est encore une autre approche.
Utilisation BInterface comme un filtre pour les classes héritées d'exclure des méthodes. Principe de Substitution de Liskov n'est pas violé dans ce cas comme un objet de BInterface classe n'est pas Un objet d'une classe, même si qu'un objet de la classe B est un objet de BInterface classe.
Ne peut pas modifier la visibilité de la méthode d'origine.
Vous pouvez créer une méthode dans struct
A
avec le même nom et ont que la méthode de privé, mais qui n'empêche pas la méthode appelée lorsqu'une instance de structA
est référencé par une variable de typeB
.Pourquoi ne pas vous rendre Virtuelle dans la classe de base et de la remplacer à ses Enfants? (plus d'aide)