为什么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
转换为base
。 main
无法做到这一点,因为它无法访问deriv
的私有(private)基础。只是为了进行实验,您可以将int main()
声明为deriv
的 friend ,然后该代码将被编译。