1. 虚函数的声明
定义:每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。
在类中,用virtual声明的成员函数。
// 案例:
class B
{
private:
int a;
public:
vortual void max(); //虚函数的声明
}
2. 虚函数的功能
虚函数主要实现C++的多态和成员函数的重写。
3. 虚函数的实现机制
说到虚函数是怎么实现的,我们首先会想到虚函数表(vtable)和虚函数指针。
虚函数的处理:编译器在编译,发现类中有成员函数为虚函数,则会建立一个虚函数表;且该虚函数表为同一个类的共享内存。
虚函数表的结构:它是一个函数指针表,每一个表项都指向一个函数。任何一个包含至少一个虚函数的类都会有这样一张表。vtable只包含虚函数的指针,没有函数体。实现上是一个函数指针的数组。虚函数表既有继承性又有多态性。每个派生类的vtable继承了它各个基类的vtable,如果基类vtable中包含某一项,则其派生类的vtable中也将包含同样的一项,但是两项的值可能不同(即指向不同的函数)。如果派生类覆盖(override)了该项对应的虚函数,则派生类vtable的该项指向覆盖后的虚函数,没有覆盖的话,则沿用基类的值。
注意:虚函数表是在编译器编译的时候创建的。