父类的私有成员子类是无法直接调用的,这就意味着子类只能间接调用父类的私有成员,其途径就是通过父类对子类可见的接口,比如说protected或者public
接口。以前我以为子类是无法使用父类私有成员的,这个认识有点片面。
子类的对象必然包含父类的对象,并且父类的对象成分是在子类之前构造完成的。而C++是通过成员初始化列表来完成次任务的,如下图所示:
如果你没有在成员初始化列表中显式地调用父类构造函数,它也会调用父类的默认构造函数。
此外,子类和父类之间还有两个关系。
1、父类的指针或者引用可以指向子类。有趣的是在这种情况下你用这个指针或者引用的成员属于父类。如下图所示:
这是为什么?因为C++规定指针或者引用的类型必须与被赋值的类型保持一致。
这有什么用?这可以为子类调用父类的成员。
形参中有父类指针或者引用的函数既可以供父类对象使用也可以供子类对象使用,即子类类型可以转化为父类类型。
但是子类对象不可以赋值给父类对象,如下图所示:
那么用子类对象去初始化父类对象的实质是什么呢?实质上是用子类对象的父类成分而不是全部子类对象,去初始化父类对象。使用父类的指针或者引用指向子类对象也是同理。
它们都用到了COPY赋值操作符或者COPY构造函数,因为父类中的形参是父类类型,子类类型可以隐式地转换成父类类型参与运算。