对于这类问题,有些人首先想到的是语言可能不够清晰。特别是,尚不清楚遗传对不同的人代表什么。
类型Curious的对象包含类型的子对象,Secretive而子对象又包含成员a。从这个意义上说,Curious确实包含a,因此它以某种方式继承了它。
完整的Curious对象不能直接访问a子对象内部的Secretive子对象,所以有人可以说它没有成员a。它在那里,但从Curious. 对于那些Curious没有继承权 a的人。
为什么有人会private在要扩展的类中声明/定义事物?
答案很简单,就这么简单。出于完全相同的原因,您可以在其他任何地方制作其他private任何东西。访问说明符用于标记作为实现细节的类型的private成员,而不是在此特定类型之外使用,无论是完全不相关的类型还是派生类型都没有区别。
私有成员的存在是为了满足您的类型需求(而不是其他类型),它们是某些功能所需要的,这些功能通过访问说明符Secretive公开给所有或仅对派生类型公开。protected但是这些函数不能被其他任何人使用,并且在某些情况下它们可能会暂时破坏您类型的不变量。
考虑一个以某种方式人为的例子,一个旨在以某种方式扩展的向量的实现。它可能有一个指向所有(包括派生类型)都可以访问的数据、大小和容量的指针,但不能从外部修改。它可能具有grow_if_need,move_existing_elements或者any_other_helper使向量处于无效状态(不变量被破坏),但是当适当使用时(从向量内部的函数)从向量的一个有效状态变为不同的有效状态。这些函数不应被外部访问,就好像它们破坏了不变量一样,但它们可用于破坏和简化实现中的代码。