gpt4 book ai didi

c++ - 多重继承中的虚表实现

转载 作者:行者123 更新时间:2023-11-30 05:38:37 26 4
gpt4 key购买 nike

我无法弄清楚如何为多重继承创建 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;
}

关于c++ - 多重继承中的虚表实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32636407/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com