c++ - “base”是 ‘deriv’ 的不可访问基

标签 c++ inheritance

为什么 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::f(base) 时从 derivbase 的转换发生在“内部 deriv”,因此必须是可访问的。不是这种情况。当您调用函数时,初始化函数参数所需的所有转换都发生在调用者的上下文中。它们不在“derive 内部”。它们发生在“外部世界”。在您的情况下,“外部世界”无法访问 deriv-to-base 转换。

在您的特定情况下,main 正在尝试将 deriv 转换为 basemain 无法执行此操作,因为它无法访问 deriv 的私有(private)基础。只是为了实验,您可以将 int main() 声明为 deriv 的友元,代码将编译。

关于c++ - “base”是 ‘deriv’ 的不可访问基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13967728/

相关文章:

c++ - 使用从模板类继承的非模板类的部分特化

c++ - qmake项目编译sqlite出错

c++ - 如何在 C++ 中将 float 转换为 vector<unsigned char>?

Java泛型继承

java - 在 super 构造函数运行之前初始化字段?

java - 使用构造函数参数实例化泛型类型?

C++如何绘制相同大小的字母

c++ - C++模板和运行时

c++ - 在指向父对象的指针上初始化子对象

C# 与 C++ - 类型、继承和 vtable