[英]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.