Почему я не могу использовать защищенный метод? Ошибка: & ldquo; 'void A :: printToScreen () const' защищен & rdquo; [Дубликат]

Я исправил это, добавив следующее к моему ~ / .bash_profile:

#PATH for rbenv
export PATH="$HOME/.rbenv/shims:$PATH"

Это то, что задокументировано в https://github.com/sstephenson/rbenv .

Из того, что я могу сказать, нет каталога ~ / .rbenv / bin, о котором упоминалось в сообщении @rodowi.

47
задан miked 25 June 2012 в 19:50
поделиться

6 ответов

Вы можете получить доступ только к защищенным членам в экземплярах вашего типа (или получить от вашего типа). Вы не можете получить доступ к защищенным членам экземпляра родительского или двоюродного типа.

В вашем случае класс Derived может получить доступ только к члену b экземпляра Derived, а не к другому Base.

Изменение конструктора для получения экземпляра Derived также решит проблему.

36
ответ дан SLaks 18 August 2018 в 18:17
поделиться
  • 1
    @AnishaKaul: вы можете получить доступ к защищенным членам вашего базового класса в экземпляре вашего типа, а не в кузене. Например, Button не может получить доступ к защищенному свойству из Control на TextBox. – SLaks 5 February 2012 в 05:07
  • 2
    You can only access your base class' protected members in an instance of your type, not a cousin type Вы снова написали одно и то же заявление, которое вы написали выше. Пожалуйста, смотрите здесь: stackoverflow.com/questions/9139824/… – Aquarius_Girl 6 February 2012 в 05:52
  • 3
    @SLaks Что вы подразумеваете под & quot; Изменение конструктора для получения экземпляра Derived также решит проблему. & Quot; ? – Mickael Bergeron Néron 3 April 2013 в 11:10
  • 4
    @ MickaelBergeronNéron: Потому что тогда вы будете получать доступ к защищенному члену по своему типу. – SLaks 3 April 2013 в 14:30
  • 5
    @SLaks, но почему экземпляр класса Base имеет доступ к закрытым членам другого экземпляра этого базового класса? – user3191398 3 August 2016 в 16:34

У вас есть доступ к защищенным членам Derived, но не к Base (даже если единственная причина, по которой это защищенный член Derived, состоит в том, что он унаследован от Base)

3
ответ дан James Curran 18 August 2018 в 18:17
поделиться
-2
ответ дан Joe Kennedy 18 August 2018 в 18:17
поделиться
Доступ к элементам

protected можно получить:

  • через this указатель
  • или к тем же типам защищенных членов, даже если они объявлены в базе
  • или из классов друзей, функции

Чтобы решить ваше дело, вы можете использовать один из двух последних вариантов.

Accept Производится в Derived :: DoSomething или объявляет Derived friend к базе:

class Derived;

class Base
{
  friend class Derived;
  protected:
    int b;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
    }
};

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      b+=that.b;
      d=0;
    }
};

В некоторых случаях вы также можете рассматривать публичные геттеры.

1
ответ дан Sergei 18 August 2018 в 18:17
поделиться

Как уже упоминалось, это именно то, как работает язык.

Другим решением является использование наследования и переход к родительскому методу:

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      Base::DoSomething(that);
      d=0;
    }
};
3
ответ дан sje397 18 August 2018 в 18:17
поделиться
  • 1
    Я дал плохой пример в вопросе, но я не могу назвать Base :: DoSomething, потому что DoSomething на самом деле идет о том, что это происходит по-другому, когда речь идет о Derived, а не о Base. – miked 14 July 2010 в 16:42
class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething()
    {
      b+=this->b;
      d=0;
    }
};

//this will work
1
ответ дан vishnu singh 18 August 2018 в 18:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: