Доступ к открытым статическим членам базового класса, указанным как частный
Я изучаю С++. В документации docs.microsoft.com/en-us/cpp/cpp/member-access-control-cpp говорится:
Когда вы указываете базовый класс как закрытый, он затрагивает только нестатические члены. Публичные статические члены все еще доступны в производных классах.
Однако следующий код слегка скорректирован из примера, следующего за предыдущим цитатой, вызывает ошибку C2247:
'Base:: y' недоступен, потому что 'Derived1' использует 'private' для наследования с 'Base'.
Я буду признателен за любую помощь в этой ситуации.
class Base
{
public:
int x;
static int y;
};
class Derived1 : private Base
{
};
class Derived2 : public Derived1
{
public:
int ShowCount();
};
int Derived2::ShowCount()
{
int cCount = Base::y;
return cCount;
}
Ответы
Ответ 1
Эта документация немного вводит в заблуждение.
Правильное поведение компилятора для Base::y
и Base::x
для обоих недоступно в Derived
, если вы используете эту нотацию, чтобы попытаться достичь члена static
.
Но вы можете связаться с ним через глобальное пространство имен (тем самым обходя Derived1
), используя другой оператор разрешения области:
int Derived2::ShowCount()
{
int cCount = ::Base::y;
return cCount;
}
Наконец, не забудьте определить y
где-нибудь, если вы хотите, чтобы этап ссылки был успешным.
Ответ 2
Измените это:
Base::y;
::Base::y;