Этот синтаксис представляет собой обходной путь для компиляции кода без ошибок путем обхода правил доступа protected
членов. Прежде чем мы начнем, запомните следующее:
"В class X
методах мы можем получить доступ ко всем его членам (private
, protected
, public
), независимо от того, принадлежит ли член объекту this
или другому объекту _7 _. Em > "
Снова рассмотрим свою функцию:
void Acc(base& b)
{
x = 5; // ok, because `x` is a protected member to `this` object
b.x = 5; // error, because `b` isn't part of `this` object
}
Давайте напишем приведенный выше код немного запутанным способом:
void Acc(base& b)
{
this->(base::x) = 5; // ok, because `x` is a protected member to `this` object
b.(base::x) = 5; // error, because `b` isn't part of `this` object
}
И еще добавим еще один уровень:
void Acc(base& b)
{
this->*(&der::x) = 5; // ok, because `x` is a protected member to `this` object
b.*(&base::x) = 5; // error, because `b` isn't part of `this` object
}
Теперь, если вы замените второй оператор, написав следующий оператор:
b.*(&der::x) = 5;
Он отлично компилируется!
На самом деле он эквивалентен b.x
, но обходит правило компилятора, которое не позволяет нам писать b.x = 5;
.
Но такое утверждение часто может приводить к неопределенному поведению. Потому что представьте, что произойдет, если b
будет передан как ссылка на some_other_derived_class_of_base
! Лучше всего ввести методы доступа для x
в class base
void base::set_x (int v) { x = v; }
person
iammilind
schedule
08.08.2013