Внутри метода производного класса нельзя обратиться к защищенным членам базового класса другого объекта базового класса. Но внутри производного класса можно обращаться к защищенным членам базового класса через другой объект, если этот другой объект имеет тип тот же тип:
class Foo
{
public:
Foo() : text_(""){}
string GetText() { return text_; }
void SetText(string text) { text_ = text; }
void CopyInFoo(const Foo& foo)
{
text_ = foo.text_; // правильно!
}
protected:
string text_;
};
class Bar : public Foo
{
public:
void CopyInBar(const Foo& foo)
{
text_ = foo.text_; // Ошибка! Нед доступа к защищенным члена базового
// класса в другом объекте базового класса
}
void CopyInBar2(const Bar& bar)
{
text_ = bar.text_; // Правильно! Есть доступ к защищенным членам базового
// класса в другом объекте этого же производного класса
}
};
Смотрите раздел 17.3 Доступ к членам базового класса в книге Липмана "Язык программирования C++. Полное руководство ".