为什么deriv中的deriv无法访问base?该程序使用class deriv : public base进行编译。

#include <cstdio>

class base
{
};

class deriv : base
{
  public:
  void f(deriv, int){printf("deriv::f(deriv, int)\n");}
  void f(base){printf("deriv::f(base)\n");}
};

int main()
{
  deriv d;
  d.f(d);
}

17: error: ‘base’ is an inaccessible base of ‘deriv’
17: error:   initializing argument 1 of ‘void deriv::f(base)’

因为已经有两个人弄错了,所以我将以粗体问:为什么base需要公开地继承?只能从deriv内部访问。

最佳答案

您似乎错误地假设调用deriv时从base转换为deriv::f(base)发生在“deriv内部”,因此必须可以访问。不是这种情况。调用函数时,初始化函数参数所需的所有转换都在调用者的上下文中发生。它们不是“在derive内部”。它们发生在“外部世界”中。在您的情况下,“外部世界”无法访问deriv -to- base转换。

在您的特定情况下,是main试图将deriv转换为basemain无法做到这一点,因为它无法访问deriv的私有(private)基础。只是为了进行实验,您可以将int main()声明为deriv的 friend ,然后该代码将被编译。

10-06 06:38