当一个类中包含虚函数时,编译器会在编译阶段为这个类生成虚函数表(virtual function table)。虚函数表是一个存储了虚函数地址的数组,每个虚函数在表中占据一个位置。对于包含虚函数的类,编译器会为每个类生成一个对应的虚函数表。
同时,编译器会在这个类的对象的内存布局中安排一个指向虚函数表的指针,通常称为虚函数指针(vptr)。这个指针指向该类的虚函数表,在对象被创建时初始化。
当进行虚函数调用时,实际调用的函数取决于对象的实际类型而不是指针或引用的类型。在运行时,程序会根据对象的实际类型通过虚函数指针找到对应的虚函数表,然后从表中取出对应虚函数的地址进行调用。这就是所谓的动态绑定或者运行时多态性。
因此,虚函数表的建立发生在编译阶段,并伴随着对象的创建和初始化。这个机制允许在运行时根据对象的实际类型来确定调用的函数,实现了多态性。