【C++】虚函数的实现机制
一.什么是虚函数 ? 虚函数是在类中由virtual关键字声明的成员函数,并且每一个含有虚函数的类都至少有一个与之对应的虚函数表,其中存放着该类所有虚函数对应的函数指针 在基类中进行如下定义: virtual void show() //由于有virtual修饰所以是虚函数 void show()//虽然和前面声明的show虚函数同名,但不是虚函数 B的虚函数表中存放着B::foo和B::bar两个函数指针。 D的虚函数表中存放的既有 继承 自B的虚函数B::foo,又有 重写 (override)了基类虚函数B::bar的D::bar,还有 新增 的虚函数D::quz。 所有虚函数地址都会存放在所属类的虚函数表vtbl中,另外在基类中声明为虚函数的成员方法,达到子类是仍然是虚函数,即使子类中重新定义基类虚函数时未使用virtual修饰,该函数地址仍会放在子类的虚函数表vtbl中 二.虚函数表是如何构造和继承的? 1)基类虚函数表的构造: 首先在基类声明中找到所有虚函数,按照其声明顺序编码,然后按照此声明顺序为基类创建一个虚函数表,其内容就是指向这些虚函数的函数指针,按照虚函数声明的顺序将这些虚函数的地址填入虚函数表中,例如若show放在虚函数声明的第二位,则在虚函数表中也放第二位 2)子类虚函数表的构建和继承: 首先将基类的虚函数表复制到该子类的虚函数表指针中