在C++中,当一个类中至少有一个虚函数时,编译器会自动生成一个虚函数表(vtable),用来支持动态多态性和运行时多态性。虚函数表是一个指针数组,用于保存虚函数的地址,每个具有虚函数的类都有一个虚函数表。
当一个对象通过指针或引用调用虚函数时,程序会根据对象的类型找到其对应的虚函数表,然后根据虚函数表中的索引位置找到相应的虚函数进行调用。这种方式可以保证程序在运行时选择合适的函数地址,实现动态多态性。
下面通过一个示例来说明C++虚函数表的实现过
#include<iostream>
using namespace std;
class Animal
{
public:
virtual void say()
{
cout<<"The animal is speaking."<<endl;
}
};
class Cat:public Animal
{
public:
void say()
{
cout<<"The cat is saying meow."<<endl;
}
};
int main()
{
Animal *p;
Cat c;
p=&c;
p->say();
return 0;
}
在上面的示例中,Animal是一个基类,Cat是Animal的派生类。在基类中定义了一个虚函数 say(),在派生类中重写了 say() 函数。在 main() 函数中,首先创建了一个Animal类的指针 p,然后把Cat的对象地址赋值给了指针 p。最后通过指针 p 调用虚函数 say()。
程序的执行过程如下:
在执行指针p调用虚函数 say() 的时候,程序先根据指针 p 所指向的对象(这里是Cat对象)找到它的虚函数表。
接着,程序会在虚函数表中查找到与虚函数调用对应的函数指针。在这个例子中,虚函数表中只有一个函数指针,它指向的是Cat对象中重写的虚函数 say()。
最后,程序通过指针调用 say() 函数,这里实际上调用的是Cat对象中的 say() 函数,输出 “The cat is saying meow.”。
总之,C++虚函数表通过动态绑定实现运行时多态性,可以让程序根据实际对象的类型来调用合适的函数,是OOP编程中非常重要的一个概念。