Стандарт C ++ говорит о защищенных нестатических членах на 11.5/1
Когда друг или функция-член производного класса ссылается на защищенную нестатическую функцию-член или защищенный нестатический элемент данных базового класса, проверка доступа применяется в дополнение к описанным ранее в разделе 11. За исключением случаев, когда формируется указатель на член (5.3.1), доступ должен быть через указатель, ссылку или объект самого производного класса (или любого класса, производного от этого класса) (5.2.5). Если доступ должен сформировать указатель на член, спецификатор вложенного имени должен назвать производный класс (или любой класс, производный от этого класса).
В дополнение к исправлению вещей, упомянутых ранее другими (конструктор B
является приватным), я думаю, что у rlbond все будет хорошо. Однако прямое следствие вышеприведенного параграфа Стандарта состоит в том, что следующее возможно с использованием указателя на член, который, возможно, является дырой в системе типов, конечно же
class B : public A {
public:
B(A &a){
int A::*dataptr = &B::data;
data = a.*dataptr;
}
};
Конечно, этот код делать не рекомендуется, но показывает, что вы можете получить к нему доступ, если вам действительно это нужно (я видел, как этот способ используется для распечатки std::stack
, std::queue
, std::priority_queue
путем доступа к защищенному элементу контейнера c
)