Не удалось получить доступ к защищенному члену базового класса, используя базовый указатель [duplicate]

Простое и эффективное решение пытается использовать метод .contains.

test.classList.contains(testClass);
47
задан miked 25 June 2012 в 19:50
поделиться

6 ответов

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

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

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

36
ответ дан SLaks 23 August 2018 в 15:39
поделиться

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

3
ответ дан James Curran 23 August 2018 в 15:39
поделиться

Использовать указатель this для доступа к защищенным членам

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      this->b+=that.b;
      d=0;
    }
};
-2
ответ дан Joe Kennedy 23 August 2018 в 15:39
поделиться
Доступ к элементам

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 23 August 2018 в 15:39
поделиться

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

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

class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething(const Base& that)
    {
      Base::DoSomething(that);
      d=0;
    }
};
3
ответ дан sje397 23 August 2018 в 15:39
поделиться
class Derived : public Base
{
  protected:
    int d;
  public:
    void DoSomething()
    {
      b+=this->b;
      d=0;
    }
};

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

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