Может ли производный класс получить доступ к закрытой статической функции-члену - PullRequest
0 голосов
/ 13 апреля 2011

У меня есть такой код, кажется, он работает. Я понятия не имею, почему частный статический метод может быть доступен так.

class Base
{
   public:
      static void f(){std::cout<<"in base\n";};
};

class Derived:private Base
{
};


int main()
{

   Derived::f();
   return 0;
}

Ответы [ 4 ]

3 голосов
/ 13 апреля 2011

Отклонено всеми испробованными мной компиляторами (несколько версий g ++, como online, IBM xlC), за исключением sun CC.Я предполагаю, что это ошибка в вашем компиляторе.

1 голос
/ 13 апреля 2011

Нет, f не должен быть доступен через Derived (кроме функции-члена), поскольку Base наследуется конфиденциально. GCC правильно сообщает об этой ошибке:

temp.cpp:6: error: ‘static void Base::f()’ is inaccessible
temp.cpp:17: error: within this contex
0 голосов
/ 13 апреля 2011

При частном наследовании все члены базового класса становятся частными членами производного класса

Производный класс наследуется от класса Base, следовательно членфункция Base :: f () становится приватным членом класса Derived.Закрытый член класса не может быть доступен извне класса (доступен только внутри функций-членов класса). Следовательно, код не может быть скомпилирован без ошибок.

Тот факт, что f () является статической функцией, не влияет на эти основные правила наследования и спецификаторы доступа.Нестатическая функция-член в Base показала бы то же поведение.

Если ваш компилятор скомпилирует этот код, то у него будет ошибка, о которой вы должны сообщить.

0 голосов
/ 13 апреля 2011

в вашем коде f() является частным наследованием, поэтому вы не можете получить к нему такой доступ

int main()
{

   Derived::f();
   return 0;
}

ошибка доступности для f()

...