在类的继承体系中子类与父类的关系

父类的私有成员子类是无法直接调用的,这就意味着子类只能间接调用父类的私有成员,其途径就是通过父类对子类可见的接口,比如说protected或者public


接口。以前我以为子类是无法使用父类私有成员的,这个认识有点片面。

子类的对象必然包含父类的对象,并且父类的对象成分是在子类之前构造完成的。而C++是通过成员初始化列表来完成次任务的,如下图所示:

如果你没有在成员初始化列表中显式地调用父类构造函数,它也会调用父类的默认构造函数。

此外,子类和父类之间还有两个关系。

1、父类的指针或者引用可以指向子类。有趣的是在这种情况下你用这个指针或者引用的成员属于父类。如下图所示:

这是为什么?因为C++规定指针或者引用的类型必须与被赋值的类型保持一致。

这有什么用?这可以为子类调用父类的成员。

形参中有父类指针或者引用的函数既可以供父类对象使用也可以供子类对象使用,即子类类型可以转化为父类类型。


但是子类对象不可以赋值给父类对象,如下图所示:

那么用子类对象去初始化父类对象的实质是什么呢?实质上是用子类对象的父类成分而不是全部子类对象,去初始化父类对象。使用父类的指针或者引用指向子类对象也是同理。

它们都用到了COPY赋值操作符或者COPY构造函数,因为父类中的形参是父类类型,子类类型可以隐式地转换成父类类型参与运算。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一:java概述:1,JDK:Java Development Kit,java的开发和运行环境,java的开发工...
    ZaneInTheSun阅读 2,687评论 0 11
  • 20- 枚举,枚举原始值,枚举相关值,switch提取枚举关联值 Swift枚举: Swift中的枚举比OC中的枚...
    iOS_恒仔阅读 2,313评论 1 6
  • 1 面向对象No6 面向对象 OO Object Oriented 编程时以对象为单元,封装数据和逻辑,以此提...
    征程_Journey阅读 1,183评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,760评论 18 399
  • 这是我的午餐,一个人,挺好,很享受。 我知道这份工作,对于我来说,开始,是有难度的,我不知道结果怎么样。第一步,坚...
    我是陈东浩阅读 205评论 0 0