持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
虚函数介绍:
虚函数就是被virtual关键字所修饰的函数。虚函数中还包括纯虚函数,纯虚函数他是函数内部没有任何操作的,他只有定义内有实现的内容。纯虚函数的一般形式:virtual 函数类型 函数名 (参数表列) =0; 虚函数的主要做就是用于实现多态,多态是把借口和时间分开的,但是许多个类中具有不同的逻辑但是拥有同样的接口。
基类:
class BaseClass
{
public:
BaseClass();
~BaseClass();
public:
virtual void Init()=0; //初始化
};
这里的初始化就是一个虚函数,但是会发现他的结尾前有 =0,可以通过这样设置为纯虚函数 纯虚函数的一般形式:virtual 函数类型 函数名 (参数表列) =0;
class MyUse : public BaseClass
{
public:
MyUse();
~MyUse();
public:
void Init(); //初始化
}
public BaseClass 这里是用于继承BaseClass类,在调用虚函数时,这里所调用的其实是它派生类重写的函数,并不是走进了基类的函数中
这里需要注意的是:子类的析构函数无论加不加virtual都是对父类的析构函数进行重写。 Vptr-> 虚函数指针 Vtbl -> 虚函数表
只要有虚函数的存在 就会有虚函数表以及虚函数指针,虚函数表其实就是虚函数的地址。并且虚函数在存储过程中会有他的顺序,弗雷德虚函数永远在子类的虚函数之前,并且如果子类中有对父类的虚函数进行重载,在虚函数表中会覆盖顾磊的虚函数。
构造函数不可是虚函数
由于构造函数是用来实例化一个对象的,也就是我们所谓的初始化,在构造函数之前虚函数指针是没有值的,所以我们没办法把构造函数作为虚函数。
析构函数最好设为虚函数
析构函数与构造函数正好相反,执行子类的析构函数后,一定会执行父类的析构函数