C++冲刺(七)C++多态实现机制

编译系统为每个包含虚函数的类包括它的子类都创建一个虚函数表,称为vftable,这是一个指针数组,存放每个虚函数的入口地址,供该类的所有对象共享。在每个类对象中放置称为vfptr的虚表指针,指向所属类的虚函数表。当通过指针调用虚函数时,编译器通过vfptr,在其所指的虚函数表中查找函数入口地址,从而实现动态多态性.

在多重继承下,如果派生类的多个基类含有虚函数,编译系统会为它创建多个虚函数表。该类的每个对象均含多个虚表指针


insight c++ object models:



总结:

1、每一个类都有虚表;

2、虚表可以继承,如果子类没有重新虚函数,那么子类虚表中仍然会有该函数的地址,只不过这个地址指向的是基类的虚函数实现。如果基类3个虚函数,那么基类的虚表中就有3项(虚函数的地址),派生类也会有虚表,至少有3项,如果重写了相应的虚函数,那么虚表的中的地址就会改变,指向自身的虚函数实现。如果派生类有自己的虚函数,那么虚函数表中就会添加该项。

3、派生类的虚表中虚函数的地址排列顺序和基类的虚表中虚函数地址排列顺序相同

猜你喜欢

转载自blog.csdn.net/u010991048/article/details/39077923