cpp继承中的那些事(上)
0x00 背景介绍
我们都知道(确性),面向对象的三大特性是封装、继承、多态,封装是基础,继承是关键,多态是补充,看吧,继承是关键,这么关键的东西我们当然有必要好好了解一下啦。
0x01 单继承和多继承
顾名思义,单继承就是派生类只有一个直接基类的继承方式,而多继承就是有多个直接基类的继承方式。而不管是哪种继承,派生类都拥有父类的所有成员(成员数据和成员函数)
1 |
|
0x02 继承方式和访问权限
和结构体相比,类就显得“自私”多了,人家结构体的默认访问权限和继承方式都是公开(public)的,这样它的数据在任一时刻任何域中都能被任意对象访问到,类则刚好相反,默认的访问权限和继承方式都是私有(private)的,也就是只给特定对象开放访问权限。
这里的结构体是在c++的语法体系中,c语言的语法中并没有结构体继承这种说法。
继承方式 | 基类成员特性 | 派生类成员特性 | 派生类对象访问情况 |
---|---|---|---|
公有继承(public) | public protected private | public protected 不可直接访问 | 可直接访问 不可直接访问 不可直接访问 |
保护继承(protected) | public protected private | protected protected 不可直接访问 | 不可直接访问 不可直接访问 不可直接访问 |
私有继承(private) | public protected private | private private 不可直接访问 | 不可直接访问 不可直接访问 不可直接访问 |
总结一下:
1. 公有继承并不会改变基类成员的访问权限,保护继承和私有继承会把公有和受保护的访问权限分别修改为受保护的和私有的
2. 只有共有访问权限下的成员能直接被访问到,其他都不可直接访问
1 |
|
0x03 关于继承中的重定义问题
当两个类存在继承关系时:
基类和派生类有同名成员变量或者成员函数,在派生类实例化对象的时候,访问到的是派生类自己的成员。
如果存在成员变量和成员函数同名,那么只能访问派生类的成员变量。
如果基类和派生类中存在同名的成员函数,但是参数列表不同,那么只能访问子类的成员函数
无论是函数名同名,还是变量名同名,还是函数和变量名同名,或是函数参数不一样,都会发生重定义,基类中的标识符都会被隐藏,只能访问派生类自己的成员,如果想要使用基类中的同名成员,那么需要使用域作用符来指定作用域。
0x04 关于构造和析构函数调用顺序问题
构造函数:
- 只有基类和派生类的时候,先调用基类的构造,再调用自己的构造
- 只有类成员的时候,先调用类成员的构造,再调用自己的构造
- 既有继承关系,又有类成员的时候,先调用基类的构造,再调用成员变量,最后调用自己的构造函数
析构函数:
析构函数的调用顺序则刚好相反,如果父类或类成员只有有参构造,那么需要在子类的构造函数中给他们赋值,使用初始化参数列表即可。
这里是不是觉得类又很无私呢~最后构造自己,最先销毁自己(233)
评论