无法调用基类保护函数?

7 c++ inheritance

我不能在我的基类中调用protected函数.为什么?它看起来像这样:

class B : B2
{
public:
  virtual f1(B*)=0;
protected:
  virtual f2(B*) { codehere(); }
}
class D : public B
{
public:
  virtual f1(B*b) { return f2(b); }
protected:
  virtual f2(B*b) { return b->f2(this); }
}
Run Code Online (Sandbox Code Playgroud)

在msvc中我得到错误错误C2248:'name :: class :: f2':无法访问类'name :: class'中声明的受保护成员

在gcc中我得到错误:'virtual int name :: class :: f2()'受到保护.

这是为什么?我认为受保护成员的要点是派生类调用.

Cal*_*ius 15

受保护的成员函数只能在基类内或其派生类中调用.你不能在课外打电话给他们.外部调用意味着调用类类型变量的成员函数.

所以

virtual f1(B*b) { return f2(b); }
Run Code Online (Sandbox Code Playgroud)

没关系,因为f2对类本身进行操作.(在里面叫)

virtual f2(B*b) { return b->f2(this); }
Run Code Online (Sandbox Code Playgroud)

不会编译,因为f2操作b而不是D类本身.(外面叫)这是非法的.

要解决它B:f2应该是公开的.