首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我可以从派生类中的静态函数访问受保护的基类成员吗?

我可以从派生类中的静态函数访问受保护的基类成员吗?
EN

Stack Overflow用户
提问于 2011-09-05 19:12:51
回答 2查看 7.6K关注 0票数 20

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

代码语言:javascript
复制
class Base {
protected:
  int var ;
};

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

我的编译器抱怨说,我不能访问pBase的受保护成员,即使派生具有对基础的受保护访问权限。有什么办法可以解决这个问题吗?或者是我误解了什么?我可以将Base变量设置为公共的,但这会很糟糕,因为在我的实际实例中,它们是一块分配的内存和信号量,用于保护它进行多线程处理。

帮助?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-05 19:25:09

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

代码语言:javascript
复制
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...
    }
} ;
票数 14
EN

Stack Overflow用户

发布于 2011-09-05 19:30:12

访问说明符应用于Derived类句柄(引用/指针/对象),而不是Derived类本身的方法。即使该方法不是static,您也会得到相同的错误。因为您没有使用派生的句柄访问varDemo

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

代码语言:javascript
复制
class Base {
protected:
  int var ;
public:
  void setVar(const int v) { var = v; } // <--- add this method
};

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

代码语言:javascript
复制
(static_cast<Derived*>(pBase))->var = 2;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7307200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档