Ниже представлен тонкий пример доступа к защищенному экземпляром поле x. B является подклассом A, поэтому любая переменная типа B также имеет тип A. Почему B:: foo() имеет доступ к полю b x, но не к полю x?
class A {
protected:
int x;
};
class B : public A {
protected:
A *a;
B *b;
public:
void foo() {
int u = x; // OK : accessing inherited protected field x
int v = b->x; // OK : accessing b protected field x
int w = a->x; // ERROR : accessing a protected field x
}
};
Вот ошибка, которую я получаю с g++
$ g++ -c A.cpp
A.cpp: In member function ‘void B::foo()’:
A.cpp:3: error: ‘int A::x’ is protected
A.cpp:14: error: within this context