欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++继承(私有,保护,多重,钻石,虚)

程序员文章站 2022-03-08 19:27:09
...

私有继承,保护继承

  • 使用 private 方式继承父类
    • public->private
    • 其他不变
    • 这种继承方式可以防止父类成员的扩散
  • 使用 protected 方式继承父类
    • public->protected
    • 其他不变
    • 可以有限防止父类成员的扩散
  • 子类以private/protected方式继承会禁止向上造型(进行类型转换),子类的指针或引用不能隐式转换成父类的指针或引用
  • 要想实现多态,只能以public方式继承父类

多重继承,钻石继承,虚继承

  1. 多重载继承
    • 在C++中一个子类可以有多个父类,在继承表中按照顺序继承多个父类中的属性和行为,并按照顺序表中的顺序调用父类中的构造函数
    • 按照从低到高的地址顺序排列父类,子类中会标记每个父类的存储位置
    • 当子类指针隐式转换成父类指针的时候,编译器会自动计算父类中的内容在子类中的位置,地址会自动进行偏移计算
  2. 名字冲突
    • 如果父类中有同名的成员,可以正常继承,如果直接使用,会造成歧义,需要 类名::成员名进行访问
  3. 钻石继承
    • 假如有一个类A,类B继承类A,类C也继承类A,然后类D继承B和C
        A
       /|\
      B...C
       \|/
        D
    
    • 一个子类继承多个父类,这多个父类有一个共同的祖先,这种继承叫钻石继承
    • 注意 钻石继承不会导致继承错误,但访问祖先类中的成员时每次需要使用类名::成员名,重点是这种继承会造成冗余
  4. 虚继承virtual
    • 当进行钻石继承时,祖先类中的内容会有冗余,而进行虚继承后,在子类中的内容只会保留一份
    • 注意 在使用虚继承时,子类中会多了一些内容(指向从祖先类继承来的成员)
  5. 构造函数
    • 一旦进行了虚继承,祖先类的构造函数只执行一次,由孙子类直接调用,祖先类的有参构造也要在孙子类中显式调用
  6. 拷贝构造
    • 在虚继承(钻石)中祖先的拷贝构造也由孙子类直接调用,子类中不再调用祖先的拷贝构造,在手动实现的拷贝构造时(深拷贝),祖先类中的内容也也由孙子类负责拷贝,赋值构造也一样