虚函数表是由类维护的,而非单独为每个对象维护的。虚函数表的维护发生在编译期和链接期间,编译器和链接器会处理虚函数表的创建和初始化。运行时,当调用对象的虚函数时,程序会通过对象的虚函数表指针(vptr)来查找相应函数的地址,并执行对应的函数。
以下是虚函数表的工作流程的简化视图:
- 类定义:编译器检测到类中有虚函数声明,为该类创建一个虚函数表。
- 类实例化:当创建类的对象时,每个对象在内存中都会包含一个指向类虚函数表的指针(vptr)。同一个类的所有对象共享同一虚函数表,不会为每个对象单独创建新的虚函数表。
- 虚函数调用:当通过基类指针或引用调用虚函数时,程序使用vptr找到虚函数表,然后通过表中的适当条目来定位要调用的函数地址,从而实现多态性。
因此,同一个类的两个对象使用相同的虚函数表,但它们各自持有自己的指向这个虚函数表的指针。如果派生类重写了某些虚函数,那么它将拥有自己的虚函数表,其中包含了重写函数的新地址,以及未被重写函数的原始地址。派生类对象的虚函数表指针将指向这个派生类特有的虚函数表。