析构函数
与构造函数对应,对象结束生命周期,系统会自动执行析构函数。
不能带任何参数,没有返回值(包括void),只能有一个析构函数,不能重载。
如果没有自定义一个析构函数,系统会自动生成一个析构函数(就算没有定义,也会有一个析构函数),
类析构顺序:1)派生类本身的析构函数;2)对象成员析构函数;3)基类析构函数。
虚函数
有了虚函数,基类指针指向派生类对象时候,就可以使用派生类的成员函数(这个函数与基类的成员函数同名)。
只有派生类的虚函数覆盖基类虚函数(函数原型相同)才能构成多态。
在有虚函数的类中,类最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放的是虚函数的入口地址,实际的虚函数在代码段中。当派生类继承基类的时候,也会继承虚函数表,当子类重写父类的虚函数时,继承的这个虚函数表中的虚函数地址也会替换成重写后的地址。
使用虚函数会增加内存开销,降低效率。
静态函数与虚函数
静态函数编译的时候就确定了运行时机,而虚函数在运行的时候动态绑定。
虚函数还用到了虚函数表和虚表指针,增加了一次内存开销。
重载和覆盖
重载:同一个函数名,参数列表不同执行不同或相同的操作,在同一个作用域中;
覆盖:基类中的虚函数,在派生类中重新定一个了,也就是重写;
为什么析构函数必须是虚函数?
将基类的析构函数设置为虚函数,那我们new一个派生类对象的时候,基类指针指向派生类对象,释放基类指针的时候,就能够释放掉子类的空间。
为什么C++默认的析构函数不是虚函数 ?
C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。
而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。