1

我对纯 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
}
4

3 回答 3

5

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

于 2013-10-25T11:53:48.463 回答
2

确实有自己的 vtable。它使用基类的 vtable指针指向它,因此只知道基类的代码可以正确调用在派生类中被覆盖的虚函数。

于 2013-10-25T12:54:54.757 回答
0

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

于 2013-10-25T13:55:13.280 回答