Вчера я столкнулся с ошибкой и, хотя мне было легко обойти, я хотел убедиться, что я правильно понимаю С++.
У меня есть базовый класс с защищенным членом:
class Base
{
protected:
int b;
public:
void DoSomething(const Base& that)
{
b+=that.b;
}
};
Это компилируется и работает отлично. Теперь я расширяю Base, но все еще хочу использовать b:
class Derived : public Base
{
protected:
int d;
public:
void DoSomething(const Base& that)
{
b+=that.b;
d=0;
}
};
Обратите внимание, что в этом случае DoSomething
все еще принимает ссылку на Base
, а не Derived
. Я бы ожидал, что у меня все еще будет доступ к that.b
внутри Derived
, но я получаю ошибку cannot access protected member
(MSVC 8.0 - еще не пробовал gcc).
Очевидно, что добавление публичного getter на b
решило проблему, но мне было интересно, почему я не мог получить доступ непосредственно к b
. Я, однако, что, когда вы используете публичное наследование, защищенные переменные все еще видны производному классу.