【问题标题】:Why derived class does not have the vtable pointer and used instead vtable of the base class?为什么派生类没有vtable指针,而是使用基类的vtable?
【发布时间】:2013-11-04 12:31:12
【问题描述】:

我对用纯 C 语言实现虚函数很感兴趣。这里是example of the implementation。然后通过指向基类的虚函数表的指针来实现派生类。为什么派生类没有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
}

【问题讨论】:

    标签: c++ c virtual-functions vtable


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 是的,总结得差不多了。现在让我们看看 OP 是否理解你所说的。
        猜你喜欢
        • 2015-10-24
        • 2012-03-14
        • 2021-07-18
        • 1970-01-01
        • 1970-01-01
        • 2017-07-18
        • 1970-01-01
        • 2017-01-16
        • 1970-01-01
        相关资源
        最近更新 更多