数据抽象:将接口与实现分离。

继承:定义相似的关系并建模

动态绑定:忽略相似类型的区别,统一进行使用,可以使用基类指针或引用指向派生类对象

基类与派生类

基类一般要定义一个虚折构函数。

派生类的折构函数会先调用自己的函数体,再调用基类的折构

当我们希望进行动态绑定时,就应该将函数声明为虚函数,否则在编译时就会被解析。

派生类重写的时候可以通过override来显式表示重写(写在函数的最后,const后)。

派生类可以访问public和protected(只有自己和派生类能访问)的基类成员,而不能访问private的基类成员,但是可以通过基类的可访问成员函数类访问私有成员。

通过使用派生类列表来继承。格式:

class classname : 访问说明符 derivated_classname

访问说明符就是public,protected和private。

对于所有需要重写的成员都需要进行声明。

如果某个派生类对于基类的虚函数并没有进行重写,则会直接使用基类的函数。

虽然派生类继承了基类中的一部分成员,但是每个类自身控制它对应的初始化过程。在构造函数中原本是使用构造函数初始值列表来初始化,但其中属于基类的成员可以直接使用基类的构造函数来初始化。方式与其他构造函数初始值列表一致,如classname(param)。

而其调用的基类构造函数由编译器决定。当初始化时,基类部分先被初始化,然后再是派生类的部分。

在作用域方面,在使用派生类作用域的时候其外层就已经套了一层隐式的基类作用域,因此可以直接使用基类成员。

需要注意的是基类的成员虽然可以被直接调用并赋值,但是使用的时候最好都调用基类的函数类对基类的成员进行控制与赋值,而不要直接在派生类中对基类进行控制。

基类的静态成员即便被继承了也是通用的,但仍然遵循访问说明符的继承规则。

派生类在声明时不需要声明继承。