gpt4 book ai didi

C++,为什么基类需要一个 VTable

转载 作者:行者123 更新时间:2023-11-30 05:49:22 33 4
gpt4 key购买 nike

根据我的理解,VTable 是调用最派生版本的函数所必需的。它将包含有关函数的最派生版本的条目......我的疑问是为什么我们需要为基类提供一个 VTable。因为使用基对象进行调用总是需要调用基类函数。

最佳答案

由于 R Shau 不喜欢我的编辑,所以我的回答高度基于他。

VTable 是一种处理多态性的方法。虽然 VTable 是 C++ 编译器广泛使用的技术,但它们可以自由提供任何其他解决方案。

当基类有一个或多个成员函数时,基类构造函数将VTable分配给一个对象。

基类构造函数无法知道被构造的真实对象是基类对象还是派生类对象,因此基类对象必须保持指向有效 VTable 的指针。

例子:

struct Base
{
Base() {}

virtual void m() {}

virtual ~Base() {}
};

struct Derived : public Base
{
Derived() : Base() {}

void m() override {}

~Derived() override {}
};

void foo()
{
Base b;
Derived d;

Base * bPtr;
}

bPtr 可能指向 Base

    bPtr = & b;
bPtr->m();

派生

    bPtr = & d;
bPtr->m();

由于bPtrBase *类型,如何进行多态调用bPtr->m(),结果应该是调用Base::m() 如果 bPtr 指向 bDerived::m() 如果 bPtr 指向 d?答:在VTable中查找m()方法的地址。

当解析 bPtr->m() 时会发生类似这样的事情:

   bPtr pointing to Base object
bPtr-> vtable_pointer -> VTable of Base -> m() -> points to address of Base::m()

bPtr pointing to Derived object
bPtr-> vtable_pointer -> VTable of Derived -> m() -> points to address of Derived::m()

因此,如果基类中没有 VTable,则无法执行多态调用,因为在运行时不知道 bPtr 指向的对象是否真的是基类对象或派生类对象。

关于C++,为什么基类需要一个 VTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773266/

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