为什么 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)
时从 deriv
到 base
的转换发生在“内部 deriv
”,因此必须是可访问的。不是这种情况。当您调用函数时,初始化函数参数所需的所有转换都发生在调用者的上下文中。它们不在“derive
内部”。它们发生在“外部世界”。在您的情况下,“外部世界”无法访问 deriv
-to-base
转换。
在您的特定情况下,main
正在尝试将 deriv
转换为 base
。 main
无法执行此操作,因为它无法访问 deriv
的私有(private)基础。只是为了实验,您可以将 int main()
声明为 deriv
的友元,代码将编译。
关于c++ - “base”是 ‘deriv’ 的不可访问基,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13967728/