继承
新定义的类就叫子类(派生类),原来的类就叫父类(基类)
子类继承于父类,会继承父类的所有东西(成员变量和成员函数)
目的:减少重复代码,让新写的代码可以重复利用已有的代码
继承方式:
- 只有父类的public成员被子类public继承才能在子类内和外都可以被访问
- 父类的protected成员被子类继承了之后只能在子类内部进行访问
- 父类的private成员被子类继承了之后不可访问
子类的构造函数:子类构造函数对自己定义的成员变量初始化,父类继承过来的成员变量需要用父类自己的构造函数初始化(未指定调用构造函数就调用父类默认的构造函数,指定的就调用指定的)
多层继承 (A->B->C)
隐藏:子类如果定义了和父类同名的函数,那么子类中就有两个这个函数,通过子类对象调用的时候,调用到是子类自己定义的,因为把父类的隐藏起来了,如果要调用父类需要指定作用域。
多重继承:
多重继承存在的问题:D中有两份A,一份是从B中继承的,一份是从C中继承, 如何解决?
B虚继承于A
C虚继承于A
D中就只有一份A
多态
多种状态、多种形态
同一个东西,在不同的环境下,会呈现出不同的状态
静态多态(早绑定):调用一个函数,在编译阶段就能够确定最终执行的是哪个函数体
动态多态(晚绑定):调用一个函数,在运行阶段才能确定最终执行的是哪个函数体
虚函数表(函数(虚函数)指针数组):只要一个类有虚函数,那么这个类就会有一个虚函数表,存放这个类的所有的虚函数的入口地址
虚函数表指针:有虚函数的类创建的对象的前四个字节(32位)是虚函数表的首地址
函数重载:调用同一个函数名,传入不同的参数,会执行不同的函数体
重载、隐藏和重写的区别:
- 重载:同一作用域内,函数名相同,参数不同,与返回值无关
- 隐藏:子类定义了和父类同名的函数,除过和父类一模一样的虚函数
- 重写(覆盖):子类定义了和父类一模一样的虚函数
Explicit作用:防止单参数的隐式类型转换
Final:Final修饰的类不能被继承
Final修饰的虚函数不能被重写
Inline:lnline修饰的成员函数成为内联函数(内联函数的本质是函数)和宏函数很像
智能指针:New了没有Delete就叫内存泄漏
(int *p=new int;可以不用delete)如果p是一个智能指针,那么当p的生命周期结束的时 候,p所指向的堆区的空间也会随之释放,不需要我们再去delete了
单例模式:有些类只能创建一个对象