繁体   English   中英

多继承中的Vtable实现

[英]Vtable implementation in multiple inheritance

我无法弄清楚如何为多个继承创建vtables的方式。 请看下面的代码。

// Iam just providing pseudocode model
class A{
  public:
         Vptr[];    // create function pointer 
         virtual void run(){}
         A(){
             this->Vptr[0] = &A::run; // push virtual function address
         }
}

class B{
  public:
         Vptr[];   // create function pointer
         virtual void sleep(){}
         B(){
             this->Vptr[0] = &B::sleep; // push virtual function address
         }
}

class C : public A, public B{
  public: 
         virtual void run(){}
         virtual void eat(){}
          C(){
             this->A::Vptr[0] = &C::run; // update function address since overrided

             // the question is onto which Vptr does eat() entry is stored?
             // this->A::Vptr[1] = &C::eat() OR this->B::Vptr[1] = &C::eat()
          } 
}

在单继承级别的情况下,它将始终将虚拟函数条目添加到同一VPTR末尾,但是在多继承中,它是如何决定的呢? 因为它有2个Vptrs

我假设您的代码实际上是伪C ++。

但是您的代码是错误的,因为在C ++中,vtable是按类而不是按实例的。 每个实例都拥有一个指向其类vtable的指针。

因此,就像(伪C ++);

fn_t A::VTable[] = { &A::run };
fn_t B::VTable[] = { &B::sleep };
fn_t C::VTable[] = { &C::run, &C::eat };

A::A()
{
    A::VPtr = A::VTable;
}
B::B()
{
    B::VPtr = B::VTable;
}
C::C()
{
    A::VPtr = C::VTable;
    B::VPtr = B::VTable;
}

如您所见, C有两个VTable,一个从A继承而另一个从B继承。 第一个扩展了C所有新虚函数。

如果C在哪里重写sleep() ,那么它将建立一个新的VTable:

fn_t C::VTableB[] = { &C::sleep };

C::C()
{
    A::VPtr = C::VTable;
    B::VPtr = C::VTableB;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM