C++继承(私有,保护,多重,钻石,虚)
程序员文章站
2022-03-08 19:27:09
...
私有继承,保护继承
- 使用
private
方式继承父类- public->private
- 其他不变
- 这种继承方式可以防止父类成员的扩散
- 使用
protected
方式继承父类- public->protected
- 其他不变
- 可以有限防止父类成员的扩散
- 子类以private/protected方式继承会禁止向上造型(进行类型转换),子类的指针或引用不能隐式转换成父类的指针或引用
- 要想实现多态,只能以public方式继承父类
多重继承,钻石继承,虚继承
- 多重载继承
- 在C++中一个子类可以有多个父类,在继承表中按照顺序继承多个父类中的属性和行为,并按照顺序表中的顺序调用父类中的构造函数
- 按照从低到高的地址顺序排列父类,子类中会标记每个父类的存储位置
- 当子类指针隐式转换成父类指针的时候,编译器会自动计算父类中的内容在子类中的位置,地址会自动进行偏移计算
- 名字冲突
- 如果父类中有同名的成员,可以正常继承,如果直接使用,会造成歧义,需要
类名::成员名
进行访问
- 如果父类中有同名的成员,可以正常继承,如果直接使用,会造成歧义,需要
- 钻石继承
- 假如有一个类A,类B继承类A,类C也继承类A,然后类D继承B和C
A /|\ B...C \|/ D
- 一个子类继承多个父类,这多个父类有一个共同的祖先,这种继承叫钻石继承
- 注意 钻石继承不会导致继承错误,但访问祖先类中的成员时每次需要使用
类名::成员名
,重点是这种继承会造成冗余
- 虚继承
virtual
- 当进行钻石继承时,祖先类中的内容会有冗余,而进行虚继承后,在子类中的内容只会保留一份
- 注意 在使用虚继承时,子类中会多了一些内容(指向从祖先类继承来的成员)
- 构造函数
- 一旦进行了虚继承,祖先类的构造函数只执行一次,由孙子类直接调用,祖先类的有参构造也要在孙子类中显式调用
- 拷贝构造
- 在虚继承(钻石)中祖先的拷贝构造也由孙子类直接调用,子类中不再调用祖先的拷贝构造,在手动实现的拷贝构造时(深拷贝),祖先类中的内容也也由孙子类负责拷贝,赋值构造也一样