C++ 基类不可访问错误,为什么私有继承会这样做?
我知道这是私人继承造成的,但我想知道为什么会这样 您明确指定基类作为派生类的私有子对象继承。因此,它在类定义之外是不可访问的 <>从C++ 17标准(14.2的基类和基类成员的可访问性)C++ 基类不可访问错误,为什么私有继承会这样做?,c++,class,inheritance,private-members,C++,Class,Inheritance,Private Members,我知道这是私人继承造成的,但我想知道为什么会这样 您明确指定基类作为派生类的私有子对象继承。因此,它在类定义之外是不可访问的 从C++ 17标准(14.2的基类和基类成员的可访问性) …如果使用私有 访问说明符、公共成员和受保护成员 可以作为派生类的私有成员访问基类的 班级 在本声明中 class a { public: int var; }; class b : a { }; int main() { a* p = new b(); return 0; } 有人
class a
{
public:
int var;
};
class b : a
{
};
int main()
{
a* p = new b();
return 0;
}
有人试图访问b
类型的对象的a
类型的私有子对象,因为指针p
的静态类型是a*
其实这句话
a* p = new b();
具有与例如相同的语义
a* p = new b();
如果允许,那么使用指针可以更改对象的私有子对象。这正是私有继承中“私有”的含义。b
继承自a
这一事实是一个实现细节,从外部看不到
我没有试图访问类之外的任何私有成员,也没有试图访问类层次结构之外的任何受保护成员,我只是试图创建一个带有基类指针的动态对象,它会引发一个错误
您正试图访问从b*
到a*
的转换,但您无法访问,因为从外部无法访问基类。私有继承更接近组合继承,而不是公共继承。你的例子可以改写为
class A
{
private:
int x = 10;
};
A a;
int *p = &a.x;
b
的实现将略有不同(因为对a
成员函数的调用是通过a_实例
而不是this
),但效果是一样的:我们组成a
的b
,而用户对此一无所知(akaprivate
).可能是它的副本,可能是它的副本,因为这是标准所说的。我想我的问题被误解了,我没有试图访问类之外的任何私有成员,或类层次结构之外的任何受保护成员,我只是尝试创建一个带有基类指针的动态对象,它会引发error@AlexMercer-这没有被误解。虽然我不能代表其他人说话,但我可以说,我对你的问题感到困惑的是你的问题是什么。该行为是预期的行为。该语言的运行完全符合其设计目的。如果您有一个关于如何在语言框架内完成特定设计目标的问题,而您所做的尝试不起作用,那么可以问这个问题。事实上,没有人知道你在问什么问题然后这个错误没有出现,但是当我尝试创建一个动态对象时,会出现一个错误,表示基类a是inaccessible@AlexMercer问题是,使用类型a*的指针试图访问类型b对象的私有子对象。@vladfrommosco因此,私有子对象
和类型b的对象
?如何知道您正试图访问它?@HelloEveryone,因为指针是由私有子对象的地址初始化的。
class b {
a a_instance;
};