为什么派生类没有vtable指针而是使用基类的vtable?

我感兴趣的是在纯C中实现虚函数。这里是一个实现的例子 。 然后通过指向基类的虚函数表的指针来实现派生类。 为什么派生类没有vtable指针而是使用基类的vtable。 也许是因为它们是相同的偏移量?

void myClassDerived_ctor(struct myClassDerived *this) { myClassBase_ctor(&this->base); this->base.vtable = (void*)&myClassDerived_vtable + sizeof(void*); // used vtable of the base class } 

必须使用基类的vtable。 重点是它看起来就像一个基类,但在vtable中有不同的条目。 因此,它的行为具有多态性。

确实有自己的vtable。 它使用基类的vtable 指针指向它,这样只知道基类的代码就可以正确地调用在派生类中重写的虚函数。

这样做是为了使多态性正常工作。 基类的指针或派生类的指针可以指向同一个对象。 如果你调用一个虚函数,那么在这两种情况下它都必须调用相同的函数(派生类的函数)。 因此派生类使基类的vtable指针指向它自己的vtable,这样在所有情况下,对象都将使用正确的vtable。