虚函数

1.虚拟析构函数
虚析构函数的目的是,当删除基类指针时,能够不仅调用基类的析构函数,也要调用派生类的析构函数。
如果析构函数不是虚拟的,将只调用对应指针的类型的析构函数。
如果析构函数是虚拟的,将调用相应对象类型的析构函数,然后会自动调用基类的析构函数。
这和其它虚函数的基于动态联编的道理是一样的。

2.在隐式类型转换下,c++不允许将一种类型的地址赋给另一种类型的指针,也不允许将一种类型的引用指向另一种类型。
指向基类的引用或指针可以隐式引用派生类对象,这称为向上强制转换,upcasting。这需要动态联编,c++使用virtual函数来标识这种动态联编需求。编译器会对虚方法使用动态联编。

3.指导原则
c++设置静态联编为默认选择,即不要为不使用的特性付出代价。
在基类中的非虚函数也表明不要重新定义该函数。
只把需要在派生类中重新定义的方法设置为虚函数。
使用虚函数时有内存和执行速度的开销。
构造函数不能是虚函数。
只有成员函数才能是虚拟的,友元函数不能是虚函数,友元不是类成员,

4.编译器处理虚函数的方法
给每个对象添加了一个隐藏的虚函数表的指针,函数表是一个数组,它保存了对象中的虚函数的地址。
调用虚函数时,由虚函数表来决定调用基类还是派生类中的函数版本。

5.纯虚函数
c++甚至允许纯虚函数有定义。对这句话的理解是纯虚函数只表明所属的类是抽象类,不能实例化,但并不影响纯虚函数有定义。

发表评论