第一次学私有继承的时候非常迷惑,感觉既然都是不可见,不就是说啥都干不了吗?然后这两天了解到了这方面的知识,总结如下。
有什么用
最大的用处是通过“继承”的纵向逻辑建立了一种“has-a”逻辑。更直白点说,就是从基类继承来的成员,具有对内可用但是对外不可见的特点,这和组合的逻辑很像。所以说,在私有继承的语境下,可以把基类看成派生类的数据成员对象。
下面回答如何使用。
初始化
注:以下代码大量简化,只是为了说明,请不要直接套用。
class father1;
class father2;
class son:private father1, private father2{...}
//使用继承的逻辑初始化。如果不是继承,可能是name(p1), year(p2)等,其中name和year是对象,为派生类的数据成员
son::son(p1,p2):father1(p1),father2(p2){}
//p1是father1构造函数需要的参数,p2同理
访问基类的方法
私有继承通过使用类名和作用域解析运算符来调用基类的方法。
如:father1::function1()
访问基类对象
如果直接要使用整个基类对象本身怎么做呢?方法是使用强制转换。因为是继承,所以可以这么做。
如:(const father1&) *this
,这个*this
指的是派生类。
访问基类友元函数
跟访问基类对象的方法一样,即强制转换,不再赘述。
注:题外话,很多时候即使是共有继承,仍然需要强制转换一下,否则容易造成递归调用。