【问题标题】:Can derived class access private static member function派生类可以访问私有静态成员函数吗
【发布时间】:2011-08-04 18:30:16
【问题描述】:

我有一个这样的代码,它似乎有效。我不知道为什么可以这样访问私有静态方法。

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

class Derived:private Base
{
};


int main()
{

   Derived::f();
   return 0;
}

【问题讨论】:

  • 不是说f()public吗?
  • @tom502,Base 类是私有继承的。 f 不应该对Derived 的非成员可见。
  • 我认为 f() 不能这样访问
  • 您使用的是什么编译器? Derived::f() 只能从Derived(或Base::f())的朋友访问。 main 好像不是Derived 的朋友。

标签: c++ static private


【解决方案1】:

我尝试过的所有编译器都拒绝了(几个 g++ 版本、como online、IBM xlC),但 sun CC 除外。我的猜测是它是你的编译器中的一个错误。

【讨论】:

    【解决方案2】:

    不,f 不应通过Derived(成员函数除外)访问,因为Base 是私有继承的。 GCC 正确地报告了这个错误:

    temp.cpp:6: error: ‘static void Base::f()’ is inaccessible
    temp.cpp:17: error: within this contex
    

    【讨论】:

      【解决方案3】:

      在您的代码中,f() 是私有继承的,因此您无法像这样访问它

      int main()
      {
      
         Derived::f();
         return 0;
      }
      

      f() 的可访问性错误

      【讨论】:

        【解决方案4】:

        在私有继承中,基类的所有成员都成为派生类的私有成员

        派生类从基类私有派生,因此成员函数 Base::f() 成为派生类的私有成员。不能从类外部访问类的私有成员(只能在类成员函数内部访问)因此代码无法干净地编译。

        f() 是静态函数这一事实对继承和访问说明符的这些基本规则没有影响。 Base 中的非静态成员函数将显示相同的行为。

        如果你的编译器编译了这段代码,那么它有一个你应该报告的错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-10
          • 2013-05-03
          • 2015-01-26
          • 2018-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多