C++中Vptr和Vtable的机制

Blu*_*ond 6 c++ virtual-functions dynamic-binding

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

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

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

int main()
{
  Base *bptr;
  Derived d;
  bptr=&d;
  bptr->fun();
}
Run Code Online (Sandbox Code Playgroud)

由于虚拟关键字/动态绑定的声明,上述函数的输出是"Derived".

根据我的理解,将创建一个包含虚函数地址的虚拟表(Vtable).在这种情况下,为派生类创建的虚拟表指向继承的虚拟表fun().并且bptr->fun()将会得到解决,bptr->vptr->fun();.这指向继承的基类函数本身.我不完全清楚如何调用派生类函数?

San*_*ahu 7

刚刚浏览了这个链接虚拟表和_vptr

它说工作流程会像..

  1. base_ptr-> base_vptr ---->检查基类中虚函数的访问.

  2. base_ptr-> derived_vptr-> virtual_function()--->调用/调用虚函数.

因此调用派生类虚函数..希望你发现它有用.