对于这类问题,有些人首先想到的是语言可能不够清晰。特别是,尚不清楚遗传对不同的人代表什么。
类型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
使向量处于无效状态(不变量被破坏),但是当适当使用时(从向量内部的函数)从向量的一个有效状态变为不同的有效状态。这些函数不应被外部访问,就好像它们破坏了不变量一样,但它们可用于破坏和简化实现中的代码。