初识虚函数
- 虚函数是带有Virtual关键字的函数
- 纯虚函数在虚函数之后加 =0 的函数
- 虚函数是动态绑定的函数
- 虚函数必须是非静态成员函数(因为静态成员函数是没有this指针的)
- 析构函数可以是虚函数(减少内存泄漏)
- 构造函数不能是虚函数(时间上冲突)
虚函数的声明
virtual int ret() ;
virtual 函数返回值类型 函数名 (参数列表)
虚函数是可以进行重写的,子类中可以对虚函数进行重写,也可以不重写。
意义:为了实现多态性,也就是动态绑定
纯虚函数的声明
virtual int ret() = 0;
virtual 函数返回值类型 函数名 (参数列表) = 0
对于拥有纯虚函数的类来说,该类是一个抽象类。什么是抽象类?就是不能进行实例化的类,只能作为基类来使用。
子类 必须对父类的纯虚函数进行实现,否则子类也为抽象类,不能进行实例化。
意义:为子类提供一个抽象给的接口,让所有子类都可以执行纯虚函数的动作,但是父类不能给子类提供一个缺省的实现。
虚指针和虚表
- 当类中有虚函数的时候,就会生成一个虚指针和虚表,一个虚表对应一个虚指针。
- 当该类为基类的时候,子类中如果重写了虚函数的话,虚表中对应的虚函数地址就会变化。
- 虚指针是一个类对象的第一成员变量,它指向一个存储在只读数据段的虚表。
- 虚表中存放的是当前类中所有的虚函数地址,是一个指针数组。
- 虚表是对于一个“类”而言的,虚指针是对于一个“类对象”说的。
- 同一个类创建不同的对象,其虚指针都指向同一个地址,也就是虚表是一样的。
- 多重继承的时候,会存在多个虚指针