C++ 基类不可访问错误,为什么私有继承会这样做?

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; } 有人

我知道这是私人继承造成的,但我想知道为什么会这样

您明确指定基类作为派生类的私有子对象继承。因此,它在类定义之外是不可访问的

<>从C++ 17标准(14.2的基类和基类成员的可访问性)

  • …如果使用私有 访问说明符、公共成员和受保护成员 可以作为派生类的私有成员访问基类的 班级
  • 在本声明中

    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
    ,而用户对此一无所知(aka
    private
    ).

    可能是它的副本,可能是它的副本,因为这是标准所说的。我想我的问题被误解了,我没有试图访问类之外的任何私有成员,或类层次结构之外的任何受保护成员,我只是尝试创建一个带有基类指针的动态对象,它会引发error@AlexMercer-这没有被误解。虽然我不能代表其他人说话,但我可以说,我对你的问题感到困惑的是你的问题是什么。该行为是预期的行为。该语言的运行完全符合其设计目的。如果您有一个关于如何在语言框架内完成特定设计目标的问题,而您所做的尝试不起作用,那么可以问这个问题。事实上,没有人知道你在问什么问题然后这个错误没有出现,但是当我尝试创建一个动态对象时,会出现一个错误,表示基类a是inaccessible@AlexMercer问题是,使用类型a*的指针试图访问类型b对象的私有子对象。@vladfrommosco因此,
    私有子对象
    和类型b的
    对象
    ?如何知道您正试图访问它?@HelloEveryone,因为指针是由私有子对象的地址初始化的。
    class b {
          a a_instance;
    };