private继承的特点和意义
private继承导致的结果
- 基类中的所有成员都会变成private;
- 如果是private继承,则**不会自动将派生类类型转换为基类类型(不会自动转换,但是可以手动显式进行转换),不能隐式转换**;
private继承的意义
不同于public继承是表示子类与基类之间的’is-a’关系,private并不象征着类之间的’is-a’关系。
private继承意味着“子类根据基类的实现而得到”。(implemented-in-terms-of,根据基类实现出子类)
由于private继承将基类的所有public都改为private,因此,可以将private继承视为继承子类的实现而略去子类的接口(因为子类的接口由于private的原因不能再被调用者调用,相当于接口被取消),接口指一个class内的public方法。
什么情况下该/不该使用private继承
由于private就是将一个类(基类)作为另一个类(子类)的一部分实现内容,即用基类来实现子类,它与对象之间的复合/包含关系很像,因此需要明确它们的异同点并考虑替代。
复合/聚合关系:即一个类包含另一个类,如在class Foo中定义一个成员,其类型是另一个类,这两个类之间就是复合关系。
使用private继承来代替复合的情况
- 存在protected成员的时候,使用private继承和使用复合的结果是不同的:复合后一个类仍然不能使用另一个类的protected成员;而private继承可以。
- 存在virtual成员的时候:复合与private继承的结果也不同。
尽量使用复合而必要的时候才使用private继承。
总结:什么时候使用private继承比复合更好
- 当你希望访问protected接口的时候,使用private继承比复合更好,因为private继承能够提供访问权限;
- 当你希望override它的virtual函数的时候,使用private继承更好,因为继承能够提供override。
- 除此之外一般来说,使用复合比使用private继承更好。