20

我有一个程序,我需要在其中创建一个在 dll 和一些应用程序代码之间共享的基类。然后我有两个不同的派生类,一个在 dll 中,一个在主应用程序中。它们中的每一个都有一些静态成员函数,它们对 nase 类中的数据进行操作。(它们需要是静态的,因为在其他地方用作函数指针)。我的问题最简单的形式如下所示。

class Base {
protected:
  int var ;
};

class Derived : public Base {
  static bool Process( Base *pBase ) {
    pBase->var = 2;
    return true;
  }
};

我的编译器抱怨我无法访问 pBase 的受保护成员,即使 Derived 已保护对 Base 的访问。有什么办法可以解决这个问题还是我误解了什么?我可以公开 Base 变量,但这会很糟糕,因为在我的真实实例中,这些是分配的内存块和用于保护它以进行多线程处理的信号量。

帮助?

4

2 回答 2

14

通常(无论函数是否为静态),派生类的成员函数只能访问其类型对象的受保护基类成员。如果静态类型不是派生类(或从它派生的类)的静态类型,则它不能访问基类的受保护成员。所以:

class Base {
protected:
    int var;
 } ;

class Derived : public Base {
    static void f1( Derived* pDerived )
    {
        pDerived->var = 2; // legal, access through Derived...
    }
    static bool Process( Base *pBase )
    {
        pBase->var = 2 ;  // illegal, access not through Derived...
    }
} ;
于 2011-09-05T11:25:08.670 回答
0

访问说明符适用于Derived类句柄(引用/指针/对象)而不是Derived类本身的方法。即使方法不是static,您最终也会遇到相同的错误。因为您没有使用var派生句柄进行访问。演示

正确的方法是提供一个setter方法:

class Base {
protected:
  int var ;
public:
  void setVar(const int v) { var = v; } // <--- add this method
};

注意:还有另一种出路,但我不确定它是否优雅。

(static_cast<Derived*>(pBase))->var = 2;
于 2011-09-05T11:30:11.900 回答