Essayer de masquer un membre public d'une classe dans une classe dérivée est généralement une mauvaise chose (*). Essayer de le cacher comme un moyen de s'assurer qu'il ne sera pas appelé est encore pire, et généralement ne fonctionnera pas de toute façon.
Il n'existe aucun moyen idiomatique normalisé que je connaisse pour empêcher l'accès à un membre protégé d'une classe parente dans un type sous-dérivé, mais déclarer un nouveau membre public inutile d'un type clairement inutile serait une approche . Le plus simple serait une classe vide. Par exemple, si la classe Foo déclare une classe publique vide appelée MemberwiseClone, les dérivées de Foo ne pourront pas appeler MemberwiseClone - probablement une bonne chose si MemberwiseClone casse les invariants de la classe Foo.
(*) La seule situation où il est approprié est quand une méthode publique d'une classe dérivée renvoie un type plus spécialisé que la méthode correspondante dans la classe de base (par exemple une méthode CarFactory.Produce() peut retourner une voiture, tandis que la méthode FordExplorerFactory.Produce() peut renvoyer un FordExplorer (qui dérive de la voiture) .Quelqu'un qui appelle Produce() sur ce qu'il pense être un CarFactory (mais s'avère être un FordExplorerFactory) obtiendra une voiture (qui se trouve être un FordExplorer), mais quelqu'un qui appelle Produce() sur ce qui est connu au moment de la compilation pour être un FordExplorerFactory obtiendra un résultat qui est connu au moment de la compilation comme un FordExplorer
+1: Aime la métaphore "parents vs amis":) –