Как я могу получить доступ к абстрактным закрытым данным из производного класса без функций друга или «получателя» в C ++? - PullRequest
0 голосов
/ 11 февраля 2011

Итак, я сейчас попал в дилемму.Как я предполагаю получить доступ к чистой абстрактной переменной частного члена базового класса из производного класса?Я слышал от друга, что к нему можно получить доступ через конструктор базы, но он не объяснил.Как это возможно?Есть несколько унаследованных классов от базового класса.Есть ли способ получить доступ к закрытым переменным?

class Base_button
{
  private:
  bool is_vis;
  Rect rButton;

  public:

  // Constructors
  Base_button();
  Base_button( const Point &corner, double height, double width );

  // Destructor
  virtual ~ Base_button();

  // Accessors
  virtual void draw() const = 0;
  bool clicked( const Point &click ) const;
  bool is_visible() const;

  // Mutators
  virtual void show();
  virtual void hide();
  void move( const Point &loc );
};

class Button : public Base_button
{
  private:
  Message mButton;

  public:

  // Constructors
  Button();
  Button( const Point &corner, const string &label );

  // Acessors
  virtual void draw() const;

  // Mutators
  virtual void show();
  virtual void hide();
};

Я хочу иметь доступ к Rect и bool в базовом классе из подкласса

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Это невозможно. Закрытые члены доступны только в том классе, в котором они определены (плюс его friend s), по дизайну .

Каждый класс несет полную ответственность за свои закрытые переменные-члены. Если подклассу необходим доступ к ним, они должны быть объявлены protected или, предпочтительно, косвенным путем через некоторые public или protected методы, предоставляемые базовым классом.

В большинстве случаев, если вы действительно думаете, что должны иметь доступ к частным лицам базового класса, это указывает на плохой дизайн базового класса или вашего подкласса!


UPDATE

Спасибо за код! Почему вы хотите получить доступ к rRect и is_vis? Я думаю, вы можете получить доступ к последним через Base_button::is_visible() и Base_button::show(), Base_button::hide().

Если все, что вы хотите сделать, это передать информацию о геометрии из вашего конструктора подкласса в базовый класс, вы действительно можете вызвать базовый конструктор:

Button::Button(const Point &corner, const string &label)
    : Base_button(corner, 100, 100)  // Presumably, this initializes rRect
{
    // ...
}
1 голос
/ 11 февраля 2011

Можно ли изменить член базового класса на protected?Это прямой способ сделать его доступным для подклассов.Я не знаю, на что ссылался ваш друг, кроме того, что конструктор вашего производного класса вызывает конструктор базового класса, а конструктор базового класса может видеть private членов базового класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...