C++通过public继承视为is-a关系。那么private继承意味着什么呢?
如果classes之间的继承关系是private,编译器不会自动将一个derived class对象转换为一个base class对象。这和public继承不同。第二条规则是,由private base class 继承而来的所有成员,在derive class中都会变成private属性,纵使他们在base class中原本是protected 或者 public属性。
Private继承以为这implemented-in-term-of。通过private继承可以让derived class采用基类已经具备的某些属性,他们之间可以并不存在任何观念上的关系。private继承纯粹只是一种实现技术,它在软件“设计”层面上没有太多意义,其意义只及于软件实现层面。
private继承意味着implemented-in-term-of,而复合(composition)也有通用的功效,那么两者直接如何取舍呢?答案很简单:尽可能使用复合,必要时才使用private继承。何时才是必要的呢?主要是当protected成员或virtual函数牵扯进来的时候(因为这个时候可以重新对base类的一些函数重新定义)。
给个例子
class Widget: private Timer{
private:
virtual void onTick() const; //查看Widget数据
...
};
Widget想要重新定义Timer内的虚函数onTick(),故必须继承自Timer。但pubic继承不合适,因为Widget不是一个Timer。藉由private继承,将onTick变成private,而我们重新声明(定义)时仍然把它留着那儿。
这是一个好设计,但是private继承并非绝对必要。我们可以用复合取而代之