почему можно получить доступ к защищенной переменной в базовом классе из производного экземпляра

Следующий фрагмент заставляет меня чувствовать себя озадаченным.
Почему der._x ++ правильный?
Так как это временная локальная переменная, скопированная из аргумента Derived.
Он должен иметь доступ только для публичных членов.
закомментированный оператор bs._x ++ не может пройти, что должно быть правильным.
Пожалуйста, дайте мне знать, где я неправильно понимаю! Заранее спасибо!

Спасибо за ваши добрые ответы. Но я сомневаюсь, что der — это объект Derived, скопированный из аргумента, иными словами, его следует рассматривать как клиента, использующего инициализированный объект Derived. Это не * этот экземпляр, а другой временный экземпляр, который получается из конструктора копирования.

class Base
{
public:
Base(int x, int y) :_x(x), _y(y){}
protected:
int _x, _y;
};

class Derived :public Base
{
public:
Derived(int x, int y,int z) :Base(x,y), _z(z){}
void mem1(Base bs, Derived der) //copy constructor called. Derived::Derived(const Derived &)
{
der._x++;
//bs._x++;
_x++;
}
private:
int _z;
};

int main()
{
Derived der(6,4,3), der1(5,3,2);
Base bs(-5,-4);
der1.mem1(bs, der);
return 0;
}

0

Решение

der._x++ является доступной так как _der является объект того же Derived учебный класс и вы получаете доступ _x изнутри Derived учебный класс.

Пока вы находитесь внутри класса, вы можете получить доступ к его членам (с или без ссылки на объект). Иначе (*this)._x будет запрещено, что не 🙂

Но вы не можете сделать то же самое для любого другого класса, который имеет место для bs._x++ следовательно, это не разрешено.

Friends в значительной степени полагаться на эту особенность языка для их реализации. Также не забыть Singleton нельзя реализовать без него (как вы называете его private constructor изнутри класса).

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector