“基础”是“派生”的无法访问的基础
‘base’ is an inaccessible base of ‘deriv’
为什么deriv
中的deriv
无法访问?该程序用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
的私有基础。只是为了实验,您可以将int main()
声明为deriv
的朋友,并且代码将编译。
如果使用class
关键字定义类,则成员和基类是私人的。
如果基类需要公开,则可以明确声明其public
(如您在问题中提到),或使用struct
关键字,该关键字默认情况下使事物公开。
为什么基本需要公开?
在这种情况下,您对f(base)
的呼叫需要从deriv
转换为base
,并且只有在可以访问基类的情况下,这种转换才有可能。是私人的,在main
中无法访问,这是需要转换的地方。
,因为它是私下继承的:
class deriv : base
class
的默认继承是私有的,这意味着其他类和功能无法访问派生类的基类。
您的示例中存在一个小问题。这个:
deriv d;
d.f(d);
由于切片而不会做您期望的事情。
如果我们通过更改f
的签名来解决上述问题:
void f(base&){printf("deriv::f(base)n");}
访问deriv
的基类仍存在问题,因为它是从基地私下继承的。
相关文章:
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 按基类对象访问派生类资源时出错
- C++11: 如何访问派生类中的基类成员?
- 访问派生类的 QMetaObject
- 使用基类对象访问派生的仅类方法
- 如何在 c++ 中通过基类引用访问派生类的对象?
- 如何在 c++ 中使用多态性访问派生类字段?
- C++继承从基类指针访问派生类中的非虚拟函数
- 无法访问派生类中的基类方法
- 如果基类指针无法访问派生类成员函数,那么多态性有什么方便的呢?
- 如果我们有一个基*类,如何访问派生模板类的成员函数
- 为什么我无法使用受保护/私有继承访问派生实例中基类的受保护成员?
- 通过在基类中虚拟调用派生类中的函数来访问派生类中的函数
- 无法访问派生类函数内的基类的受保护数据成员
- D 指针/pimpl 模式基类指针访问派生类成员
- 友元类对象是否可以在其成员函数中访问派生类对象的基类私有成员?
- 访问派生类C++中的受保护成员
- 从C++中的"interface"访问派生类成员?
- 通过基类的指针,我们无法访问派生类特定的成员
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++