Ошибка на C ++: «ошибка: int aaa :: bbb защищено в этом контексте» - PullRequest
1 голос
/ 10 июля 2020

После многих лет программирования на C, я делаю свои первые шаги на C ++.

Я пытаюсь asp оттачивать «защищенную» концепцию, и есть много материала в Интернете, где объясняется, что такое переменные protected и для чего они используются. Однако при попытке написать пример super-basi c, просто чтобы запачкать руки с помощью C ++, я столкнулся с ошибкой:

error: 'int parent :: protected1' is protected в этом контексте

Итак, небольшая помощь будет оценена.

class parent {
public:
    int getProtected() { return protected1; }
protected:
    int protected1;
};

class child: public parent { };

int main()
{
    child ch;

    cout << ch.protected1 << endl;    // error: 'int parent::protected1' is protected within this context
    cout << ch.getProtected() << endl;   // OK
    return 0;
}

Везде говорится, что protected переменные доступны только в иерархии наследования. Если это так, я пытаюсь понять - что я здесь делаю не так?

Понятие «защищенная переменная» на самом деле не укоренилось. private хорошо понимается как частная Переменная принадлежит дочернему экземпляру и поэтому доступна только дочерним методам. Однако, если дочерний элемент может получить доступ к переменной protected родителя, означает ли это, что родительский объект должен быть создан, прежде чем ребенок сможет получить доступ к этой переменной protected?

Ответы [ 4 ]

2 голосов
/ 10 июля 2020

Вы пытаетесь получить доступ к напрямую члену класса protected1. Это возможно, только если член public.

Ваш класс child все еще может получить доступ к этому члену, поэтому вы можете попробовать:

class parent {
public:
    int getProtected() { return protected1; }
protected:
    int protected1;
};

class child: public parent { 
public:
  int getProtectedFromChild() { return protected1; }
};

int main()
{
    child ch;

    cout << ch.getProtected() << endl;   // OK
    cout << ch.getProtectedFromChild() << endl;   // This should work
    return 0;
}
2 голосов
/ 10 июля 2020

1-й вопрос: Везде сказано, что защищенные переменные доступны только в иерархии наследования. Если это так, я пытаюсь понять - что я здесь делаю не так.

Вы пытаетесь получить доступ к защищенному члену из main, а main находится за пределами иерархии наследования . Так же, как private скрывает часть реализации класса от кода вне этого класса, protected скрывает часть реализации класса от кода за пределами этой иерархии. Поскольку main находится как вне класса, так и вне иерархии, оба protected и private прячутся от него.

2-й вопрос: концепция «защищенной переменной» на самом деле не утонула in. «Частная» хорошо понимается, поскольку частная переменная принадлежит дочернему экземпляру и, следовательно, может быть доступна только дочерним методам. Однако, если дочерний элемент может получить доступ к защищенной переменной родителя, означает ли это, что родительский объект должен быть создан, прежде чем дочерний элемент сможет получить доступ к этой защищенной переменной?

Родитель должен быть создан, прежде чем дочерний элемент сможет даже быть экземпляром. Дети являются экземплярами своих родителей.

Если у вас есть class car : public vehicle, то каждое car также будет vehicle. Если у вас есть экземпляр класса car, у вас обязательно должен быть экземпляр vehicle.

2 голосов
/ 10 июля 2020

protected означает, что ваш класс child имеет доступ к полю parent (от которого он публично наследует) class 'protected1. Если бы вместо protected было private, child не смог бы получить доступ к этой переменной.

Ваша функция main() не находится в производном классе parent - поэтому она не может получить доступ protected поля.

2 голосов
/ 10 июля 2020

Доступ к защищенной переменной-члену можно получить только через функции-члены родительского или дочернего класса, как показано в вашем примере. Таким образом:

ch.protected1

не компилируется, поскольку вы пытаетесь получить доступ к элементу данных извне класса.

...