【问题标题】:cannot call base class protected functions?不能调用基类保护函数?
【发布时间】:2009-01-25 15:36:43
【问题描述】:

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

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 中,我收到错误 error C2248: 'name::class::f2' : cannot access protected member declaration in class 'name::class'

在 gcc 中出现错误:'virtual int name::class::f2()' is protected.

这是为什么呢?我认为受保护成员的意义在于派生类可以调用。

【问题讨论】:

  • 至少添加将编译并生成您希望我们修复的错误的代码。上面的代码有很多其他的语法错误,解决你的问题变得无关紧要。
  • 我同意马丁的观点。如果您希望我们帮助您,请花一些时间编写您的代码 c++(不要省略返回类型、分号和其他内容)

标签: c++ inheritance


【解决方案1】:

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

所以

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

没问题,因为 f2 对类本身进行操作。 (内部调用)

但是

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

不会编译,因为 f2 对 b 而不是 D 类本身进行操作。 (在外面叫)这是违法的。

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

【讨论】:

  • 问题,有什么办法可以解决这个问题,我来自托管世界,这是允许的,我发现它非常有用,我真的不想把这些私人的东西放在内部,但如果有没办法,我想我必须这样做。是否可以让班级成为自己的朋友?
  • 约翰,要么公开 f2,要么宣布 D 成为 B 的朋友。我不知道还有什么办法。
猜你喜欢
  • 2016-03-26
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-07
相关资源
最近更新 更多