доступ частных членов в наследство - PullRequest
25 голосов
/ 23 ноября 2011

У меня есть класс A, у которого поле val объявлено как private.Я хочу объявить класс B, который наследуется от A и имеет доступ к val.Есть ли способ сделать это на C ++?

Я хочу сделать это, потому что мне нужно перегрузить некоторые функции A, вообще не меняя код.

Ответы [ 5 ]

44 голосов
/ 23 ноября 2011

Быстрый ответ: нет. Вот для чего нужно ключевое слово protected, которое вы хотите использовать, если хотите предоставить доступ к подклассам, но никому другому.

private означает, что никто не имеет доступа к этим переменным, даже подклассы.

Если вы вообще не можете изменить код в A, возможно, для этой переменной есть метод доступа public / protected. В противном случае эти переменные не предназначены для доступа из подклассов, и только хаки могут помочь (что я не поощряю!).

16 голосов
/ 23 ноября 2011

Закрытые члены базового класса доступны только для базовых функций-членов (не производных классов).Таким образом, у вас нет прав, даже нет возможности сделать это :)

class Base

  • public : могут быть доступныanybody
  • private : доступны только для базовых функций-членов (не производных классов)
  • protected : доступны как базовые функции-члены, так и производные классы
8 голосов
/ 23 ноября 2011

Что ж, если у вас есть доступ к базовому классу, вы можете объявить класс B как класс друга . Но, как объяснили другие: потому что вы можете, это не значит, что это хорошая идея. Используйте защищенные члены, если хотите, чтобы производные классы могли иметь к ним доступ.

3 голосов
/ 23 ноября 2011

Это выполнимо, как описано в этом Гуру недели - ПОЛУЧИЛ # 76 - Использование и злоупотребление правами доступа . Но это следует считать последним средством.

1 голос
/ 23 ноября 2011

Вы должны определить его как protected. Защищенные члены наследуются дочерним классам, но не доступны из внешнего мира.

...