[疑问]派生类可以通过public接口操作从基类继承来的的私有成员,自己却不能直接操作该私有成员——现实世界有良好的对应可以比喻吗?解决方案

[疑问]派生类可以通过public接口操作从基类继承来的的私有成员,自己却不能直接操作该私有成员——现实世界有良好的对应可以比喻吗?
面向对象的思想既然是受现实世界的启蒙,那么,具体实现这套规则的时候,也应该能够较好的对应现实世界。

现在假设有基类Base定义为
class Base
{
 public:
  void Set_attr(){}
  void Get_attr(){}

 private:
  int attr;
}

派生类Derived定义
class Derived:public Base
{
}


接下来,我们都知道,如果定义了一个具体的对象Derived abc,那么我们可以使用abc.Set_attr()和abc.Get_attr(),却不能直接访问attr这个私有成员。

这种事情,就是具备某种属性,但自己看不见,也只能通过受到限制的接口去改变它。。。。。

我好奇的是,这种事情,现实世界有吗?比如,父亲的某种属性,自己可以随意改变,继承到儿子的时候,儿子有这个属性,自己却又看不见,只能通过特定的方法去改变它。。。。怎么感觉怪怪的呢?有没有个较好的现实世界的比喻与之对应呢?

------解决方案--------------------
你从『动物』类继承了『胃』,但是你没法自己伸手进去捏它让它蠕动。你只能通过调用『吃东西』这个接口操作它。

------解决方案--------------------
至于能不能访问成员的问题, 是属于另一个 "封装" 的概念了.
封装的概念是隐藏实现的细节, 被封装过的东西即使是这个东西本身也不能直接访问的.不让你看见是不想让你去关注这些细节, 比如人有血压这么个属性, 然后有一个统一操作方法来获取了, 就没有必要再让每一个具体的人去知道自己的心脏, 血管, 血液这些具体的东西了.
在上面的例子中, 对于 Base 或 Derived 的对象, 你都只能使用它的方法来访问, 不能操作它的成员.

------解决方案--------------------
探讨
至于能不能访问成员的问题, 是属于另一个 "封装" 的概念了.
封装的概念是隐藏实现的细节, 被封装过的东西即使是这个东西本身也不能直接访问的.不让你看见是不想让你去关注这些细节, 比如人有血压这么个属性, 然后有一个统一操作方法来获取了, 就没有必要再让每一个具体的人去知道自己的心脏, 血管, 血液这些具体的东西了.
在上面的例子中, 对于 Base 或 Derived 的对象, 你都只能使……