14

在 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();
}

由于声明了虚拟关键字/动态绑定,上述函数的输出为“Derived”。

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

4

3 回答 3

15

刚刚通过这个链接虚拟表和_vptr

它说工作流程将像..

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

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

因此调用了派生类虚函数。希望对您有所帮助。

于 2013-10-07T12:05:39.537 回答
3

并且 bptr->fun() 将被解析为 bptr->vptr->fun();。这指向基类函数本身。

错误的。实例的Derivedvptr(每个实例中的隐藏字段)指向Derivedvtable。

于 2013-10-07T11:51:54.130 回答
0

该标准没有指定实现多态性的机制。标准所说的只是它应该如何工作——而不是编译器供应商应该如何实现它。

话虽这么说,就 Linux 下的 GCC 和 Windows 下的 MSVC 而言,你已经非常正确了,我希望大多数其他编译器都是类似的。

于 2013-10-07T11:53:16.850 回答