无法调用基类保护函数?

时间:2009-01-25 15:36:44

标签: 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); }
}

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

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

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

1 个答案:

答案 0 :(得分:15)

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

所以

virtual f1(B*b) { return f2(b); }

没问题,因为f2对类本身进行操作。 (在里面叫)

但是

virtual f2(B*b) { return b->f2(this); }

不会编译,因为f2在b上运行而不是在D类本身上运行。 (外面称)这是非法的。

要修复它,B :: f2应该是公开的。