C++中Vptr和Vtable的机制

zqdjd7g9  于 2023-03-25  发布在  其他
关注(0)|答案(3)|浏览(123)

在C++中,在动态绑定期间,考虑以下示例...

class Base
{
  virtual void fun()
  {
     cout<<"Base";
  }      
};

class Derived : public Base
{
   void fun()
   {
     cout<<"Derived";
   }
};

int main()
{
  Base *bptr;
  Derived d;
  bptr=&d;
  bptr->fun();
  return 0;
}

由于声明了虚拟关键字/动态绑定,上述C++程序的输出为“派生”。
据我所知一个虚表(Vtable)将被创建,其中包含虚函数的地址。在这种情况下,为派生类创建的虚表指向继承的虚fun()。而bptr->fun()将被解析为bptr->vptr->fun();。这指向继承的基类函数本身。我不完全清楚派生类函数是如何调用的?

lqfhib0f

lqfhib0f1#

刚刚浏览了这个链接virtual table and _vptr
上面说工作流程会像。

  1. base_ptr-〉base_vptr----〉检查基类中虚函数的访问。
  2. base_ptr-〉derived_vptr-〉virtual_function()---〉调用/调用虚函数。
    因此,派生类的虚函数被称为..希望对你有帮助。
ddrv8njm

ddrv8njm2#

而bptr-〉fun()将被解析为bptr-〉vptr-〉fun();。这指向基类函数本身。
错误。Derived示例的vptr(每个示例中的隐藏字段)指向Derived vtable。

hi3rlvi2

hi3rlvi23#

该标准并没有指定多态性的实现机制,它只说明了多态性应该如何工作,而不是编译器供应商应该如何实现多态性。
话虽如此,就Linux下的GCC和Windows下的MSVC而言,你已经做得很好了,我希望大多数其他编译器都是类似的。

相关问题