我有一个程序,我需要创建一个在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变量设置为public,但这会很糟糕,因为在我的实例中,这些是分配内存的块和用于多线程保护它的信号量。
帮助?
答案 0 :(得分:12)
一般情况下(无论函数是否为静态),a 派生类的成员函数只能访问受保护的基类 类型对象的类成员。它无法访问受保护的 如果静态类型不是派生类的类型,则为基类的成员 (或从中派生的类)。所以:
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...
}
} ;
答案 1 :(得分:0)
访问说明符适用于Derived
类句柄(引用/指针/对象),而不适用于Derived
类本身的方法。即使该方法不是static
,您最终也会遇到相同的错误。因为您没有使用派生句柄访问var
。 Demo
正确的方法是提供setter
方法:
class Base {
protected:
int var ;
public:
void setVar(const int v) { var = v; } // <--- add this method
};
注意:还有一条出路,但我不确定它是否优雅。
(static_cast<Derived*>(pBase))->var = 2;