我有一个程序,我需要在dll和一些应用程序代码之间共享一个基类。然后我有两个不同的派生类,一个在dll中,另一个在主应用程序中。它们中的每一个都有一些静态成员函数,这些函数对nase类中的数据进行操作。(它们需要是静态的,因为在其他地方用作函数指针)。我的问题最简单的形式如下所示。
class Base {
protected:
int var ;
};
class Derived : public Base {
static bool Process( Base *pBase ) {
pBase->var = 2;
return true;
}
};
我的编译器抱怨说,我不能访问pBase的受保护成员,即使派生具有对基础的受保护访问权限。有什么办法可以解决这个问题吗?或者是我误解了什么?我可以将Base变量设置为公共的,但这会很糟糕,因为在我的实际实例中,它们是一块分配的内存和信号量,用于保护它进行多线程处理。
帮助?
发布于 2011-09-05 19:25:09
一般而言(无论函数是否为静态函数),派生类的成员函数只能访问其类型的对象的受保护基类成员。如果静态类型不是派生类(或从派生类派生的类)的静态类型,则它无法访问基类的受保护成员。所以:
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-05 19:30:12
访问说明符应用于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;
https://stackoverflow.com/questions/7307200
复制相似问题