可以从派生类中的静态函数访问基类受保护的成员吗?
Can I access a base classes protected members from a static function in a derived class?
我有一个程序,我需要在dll和一些应用程序代码之间共享一个基类。然后我有两个不同的派生类,一个在dll中,一个在主应用程序中。它们中的每一个都有一些静态成员函数,这些函数对nase类中的数据进行操作。(它们需要是静态的,因为在其他地方用作函数指针)。我的问题的最简单形式如下:
class Base {
protected:
int var ;
};
class Derived : public Base {
static bool Process( Base *pBase ) {
pBase->var = 2;
return true;
}
};
我的编译器抱怨我不能访问pBase的受保护成员,即使派生的对Base有保护访问。有别的办法吗,还是我误解了什么?我可以使基本变量公开,但这将是糟糕的,因为在我的实际实例中,这些是一块分配的内存和信号量,以保护多线程。
帮助吗?
一般情况下(不管函数是否是静态的)派生类的成员函数只能访问受保护的基类其类型对象的类成员。它不能访问受保护的如果静态类型不是派生类的静态类型,则为基类的成员(或从它派生的类)。所以:
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...
}
} ;
访问说明符适用于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;
相关文章:
- 继承和友元函数,从基类访问受保护的成员
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 基类中受保护的纯虚函数如何被基类的友元类使用?
- 派生类无法访问基类的受保护成员
- 无法在赋值运算符中访问基类的受保护方法
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 使用基类的C++和修改私有/受保护的属性
- 使从一个基类派生的类能够使用继承的受保护成员
- 无法访问派生类函数内的基类的受保护数据成员
- 派生类如何使用基类的受保护成员
- 如何影响派生类中受保护的基变量
- 访问基类的受保护成员
- 使用指向派生类中的基类的指针访问受基类保护的成员
- 用受保护的继承指向基类方法
- 为什么这两个涉及受保护派生类的C++示例的编译方式不同?
- 无法在受保护的类中显示变量
- protected是否保护基类构造函数或继承的类构造函数
- 如何避开受保护的类成员
- C++:允许受保护的类成员而不是私有成员访问
- C++继承和受保护基类成员的访问:用Java风格做这件事是个坏主意吗