C++的社会繁衍

把 C++ 想象成人类社会。
访问权限、继承、友元将无比真实的反应人类社会中的种种关系。

一、类内部访问权限
+---------+
|class    | -->+---------+
|public   | --> 你能干啥
|protected| --> 你留下啥
|private  | --> 你藏了啥
+---------+
|friend   | --> 你的圈子
+---------+

几乎所有人都知道你能干啥,这某种程度上是你在这个社会的价值体现。但这些不相干的人,并不知道你留下了啥,是万贯家财?还是诗书传承?谁知道?你的家人知道(类内部),你的后代知道(子类),你的朋友知道(友元)。至于你藏了些啥,除了你的家人(类内部),可能也只有几位密友(友元)了解。

二、继承时访问权限

+---------+
|Inherits | --> 繁衍后代
+---------+
|public   | --> 嫡出
|protected| --> 庶出
|private  | --> 私生
+---------+

C++ 的社会没有计划生育,也似乎没有限制一夫一妻。所以就存在正房和偏房的问题,嫡长子光明正大(public)的继承了你的财产和光环(public, protected)。其余庶出(protected)的就没那么好运了,仅仅能够分到一点财产(protected, protected)。而风流快活的产物——私生子(private)更是可怜,分到的东西谁也说不得,是私密。

三、开始处理各种继承问题(两种访问权限的混搭)

class Base {
protected:
    int prot_mem;
};

class Sneaky : public Base {
    friend void clobber(Sneaky &s) { s.j = s.prot_mem = 0; }
    friend void clobber(Base &b) { b.prot_mem = 0; } // error
    int j;
};

prot_mem 是 Base 的 protected 成员。那么对于 以 public 的姿势继承 Base 的子类 Sneaky 来说,它可以取得该成员(嫡长子)。
而第一个 clobber 作为 Sneaky 的密友,自然也可以取得 Sneaky 的成员,如其自己的 j,以及继承自父类的 prot_mem。
第二个 clobber 作为 Sneaky 的密友,却妄想去直接拿其父亲留下的 prot_mem,这显然是不合理的。 注意这里与上面那个的区别,该密友越过了 Sneaky,直接去拿其父亲的遗物,这是违背了社会法规的。

四、私生子的逆袭

从上面的一些例子,可以很明显的看到私生子的惨状,只要私生,祖上的一切接变成 private,几乎没法再传承下去。
幸好 C++ 的社会里倒也公平,提供了一个 using 关键字,让私生子也有了逆袭的机会。如下例

#include <cstddef>

class Base {
public:
    std::size_t size() const { return n; }
protected:
    std::size_t n;
};

class Derived : private Base {
public:
    using Base::size;
protected:
    using Base::n;
};

所谓私生子的 Derived,原本 size 和 n 都是私有成员,经过 using 声明后,前者为 public,后者为 protected。逆袭成功。

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值