Effective C++ 第三十九条 Use private inheritance judiciously.

明智而审慎地使用 private 继承
先清楚 private 继承的结果
derived 继承 base 的所有内容,并且为 private ,即使这些内容原本是属于 public 或者是 protected 的。这样的结果就是,private 继承继承了 base 的实现,却没有继承接口。这意味着 is-implemented-in-terms-of ,这与上一章提到的复合(composition)相同,但是尽可能的要使用复合而不是 private 继承。只有当涉及到 protected 成员或者 virtual 函数的时候才必须使用 private 继承。
相当多的时候,使用 public继承加复合 可以替代 private 继承。比如 derived 需要继承 base 的实现,但是不希望这个接口暴露,那么 public 继承显然不在考虑范围内。采用 public 继承加复合却可以。
这样做既使用了 base 的接口 fun,又不至于该接口暴露,而被任意使用。再者,可以防止 base 的函数被重新定义,一旦采用继承,即使 derived 不能调用该函数,也可以重新定义它。如果需要降低编译耦合度,只需要前置声明一下 base,使用 base 指针指向 _base 即可,不需要包含 base 的实现。
下面有一个极端的例子,适合使用 private 继承,就是一个没有成员变量也没有 non-virtual 函数的空类
Int 比 int 占空间大的原因是,虽然 Empty 什么都没有,但是它需要一个不为 0 的空间标识其独特性,如果有多个类似的 Empty,都不占用空间的话,就无法标识谁是 Empty1,谁是 Empty2。在这里,Empty 是一个独立的个体,大小不为0.若此时采用 private 继承
这个时候二者大小就相等了,因为这里的 Empty 并非独立,而是依附于 Int ,不是独立属性的对象,大小可以为 0.这种优化叫做 EBO (empty base optimization)。