gpt4 book ai didi

c++ - vptr 和 vtable 如何在下面的虚拟相关代码中工作?

转载 作者:行者123 更新时间:2023-11-27 23:38:59 27 4
gpt4 key购买 nike

据我所知,当我们在基类中创建一个虚拟函数时,编译器会创建一个可以称为 vptr 的指针和一个包含虚函数条目的 vtable,这些虚函数是此类的最新版本,以防被覆盖函数。并且 vptr 指向 vtable。从基类派生的类具有相同的故事,它们有一个指针 vptr 和自己的 vtable,其中包含最新虚函数的条目。要理解我的问题,请遵循代码

#include <iostream>
using namespace std;
class base
{
public:
virtual void display(void)
{
cout << "base\n";
}
};

class derived : public base
{
public:
void display(void)
{
cout << "derived\n";
}
};
int main(void)
{
base *p;
base ob1;
derived ob2;
p=&ob2;
p->display();//my point starts from here
p->base::display();

}

在上面的代码中语句p->display();对象 p 指向调用此类的 vptr 并从 vtable 中查找显示函数并绑定(bind)它确实有意义。但我不明白我将如何描述语句 p->base::display();在vptr和vtable方面。编译器将如何绑定(bind)基类版本的显示功能。因为派生类的vtable中不会有基类版本的显示功能。如果我的知识在这里有任何错误,请告诉我什么是正确的。如果我是对的,请告诉我如何描述 p->base::display();用我描述的逻辑声明 p->display();声明

最佳答案

But i am not understanding that how would i describe the statement p->base::display(); in terms of vptr and vtable .how the compiler will bind the display function of base class version

Vptr 不以任何方式参与该调用。 Vptr 仅用于虚拟调度。

在该调用中使用显式范围解析意味着您正在使用静态分派(dispatch)。你是说,无论对象参数的动态类型如何,都调用函数 base::display


虚拟分派(dispatch)是运行时多态性的一种形式,也是面向对象编程的一个关键特征。当以虚拟方式调度函数调用时,调用将被调度到继承层次结构中函数的最派生重写,这取决于对象的动态类型。

相比之下,静态调度的函数调用是使用编译时名称解析来调度的,它不受对象的动态类型的影响。这是 C++ 中使用的默认分派(dispatch)类型。它通常也是命令式、非面向对象的语言(例如 C)中唯一的分派(dispatch)类型。

Virtual dispatch 只能与虚函数一起使用。虚拟分派(dispatch)通常使用虚函数表 (vtable) 和虚函数指针 (vptr) 来实现。

关于c++ - vptr 和 vtable 如何在下面的虚拟相关代码中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57062360/

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