虚函数表是针对类的还是针对对象的?同一个类的两个对象的虚函数表是怎么维护的?

答:虚函数表,或者称为vtable,是针对类的。虚函数表是一个存储类中所有虚函数地址的数组。当我们定义一个类,并在其中声明了虚函数时,编译器就会为这个类生成一个虚函数表。

每一个对象(或者说是实例),只要它的类有虚函数,那么它就会有一个指向这个类的虚函数表的指针。这意味着,同一个类的各个对象,它们的虚函数表指针都指向同一个虚函数表。所以,虽然每个对象都有自己的虚函数表指针,但是同一个类的所有对象共享同一个虚函数表。

举个例子,假设我们有一个基类Animal,它有一个虚函数makeSound()。那么,Animal就有一个虚函数表,其中包含了makeSound()的地址。然后我们创建了两个Animal对象,catdog。这两个对象都有一个指针指向Animal的虚函数表,即使是两个不同的对象,但是它们的虚函数表是相同的。

然后,如果我们有一个子类Cat继承自Animal,并且重写了makeSound()函数。那么,Cat也会有一个虚函数表,其中makeSound()的地址被替换为Cat类中的makeSound()函数的地址。当我们创建一个Cat对象kitty时,kitty的虚函数表指针就会指向Cat的虚函数表。

发表评论

后才能评论