c++学习[05] 类和对象 2 继承
·
继承
共性——>特性
父类——>子类(又叫基类和派生类)
继承的好处:减少重复代码,提高代码复用率
语法:
class 子类 :继承方式 父类
继承方式
- 公有继承
- 保护继承
- 私有继承
父类中私有成员不可访问,但是会被继承,只是被编译器隐藏
![![[继承方式.png]]](https://i-blog.csdnimg.cn/direct/1e7e1743043b4deda19b06a5e34774c9.png)
继承中的对象模型
父类继承过来的成员,哪些属于子类对象?
父类中所有非静态成员都被继承;
私有属性被编译器隐藏,所以访问不到,但是被继承
构造和析构顺序
子类继承父类,创建子类对象,调用父类的构造函数。
父类和子类的构造、析构顺序:
创建父类对象,调用父类构造初始化,生命周期结束,调用父类析构。
创建子类对象,由于继承父类,创建父类对象:调用父类的构造、析构。
调用顺序:![![[继承中构造、析构函数顺序.png]]](https://i-blog.csdnimg.cn/direct/f9fd7550d7f94627901e8a7e1b065284.png)
先构造父类,再构造子类,析构顺序和构造相反
可以简单记成:先有爸爸,同时爸爸最后走
同名成员处理
父类、子类出现同名成员,如何通过子类对象访问父类中同名的数据:
- 访问子类同名成员,直接访问;
- 父类,成员前加父类作用域 Base::成员名
s.Base::a
- 子类中出现同名成员,会隐藏掉父类中的所有(包括重载)同名成员,因此就算调用父类中的重载函数,同样需要加作用域
同名静态成员
和非静态成员出现同名处理方法一致,但是有两种访问方式:
- 通过对象 “.” + 父类名 ::
- 通过类名
子类名::成员名
或
子类名::父类名::成员名——第一个冒号表示通过类名访问,第二个表示访问父类作用域下
多继承
一个类继承多个类
语法:class 子类 : 继承方式 父类1, 继承方式 父类2…{};
父类中有同名函数出现,需加作用域区分
实际开发不建议用多继承
菱形继承 (虚继承)
![![[菱形继承.png]]](https://i-blog.csdnimg.cn/direct/3e0b9e48a6eb4281975d9c9ca3f17670.png)
问题1.二义性 2.只需要一份数据
解决:利用虚继承——继承前加上关键字virtual
最大类叫虚基类
![![[虚继承.png]]](https://i-blog.csdnimg.cn/direct/4bd7d0f9eda04cf3aeda3b6838db6f03.png)
继承指针,指针指向虚基类表,表中记录偏移量,通过偏移量找到唯一数据
继承是多态的基础,虚继承的指针是后续实现多态的基础~
更多推荐
所有评论(0)