从虚函数调用派生类的成员

我对虚拟功能有点困惑。

让我们假设你有一个虚函数foo()的Base类,然后该函数在Derived类中重写

   class Baseclass
   {  
   public:
       virtual void foo()
       {
           //...
       }
   };

   class Derived: public BaseClass
   {
   private:
       int member_val;
   public:
       Derived( int init )
           : member_val( init )
       {}
       void foo()
       {
           member_val++;
       }
   };

和foo使用Derived类的成员值,当我写这个代码

Derived d( 10 );
Base* bPtr = &d;
bPtr->foo(); 

因为_vptr指向“派生类虚拟表”,并且Derived类虚拟表中的指针指向Derived类的foo(),但是如何找到member_val,导致Base指针不知道,foo()会调用Derived类关于它。 什么“this”从Derived类传递给foo()。 我们将其称为Base *(这是Base类型),但要找到member_val,我们需要Derived *(此派生类型)。 那么它如何在引擎盖下工作?


正确的问题是一半的答案。 就像你的情况一样,你问this是什么传递给Derived::foo() ,答案是“相同的”。 您创建Derived类的对象。 它被分配在内存中,如下所示:

Derived:
--------
vptr_t* vptr
int member_val

然后,您将&d Derived*Base* 。 指针发生了什么? 没有。 它只是改变了它的类型,而不是它指向的实际地址。 你可以比其转换回Derived*使用dynamic_cast<Derived*>()甚至static_cast<Derived*> 在这种情况下使用两者是绝对安全的。

所以唯一真正的问题是虚拟函数表是如何工作的? 但这是另一个问题,而且你似乎理解它。

请注意:当多个基类一个接一个地位于内存中时,事情对于多继承来说更加复杂。

链接地址: http://www.djcxy.com/p/23327.html

上一篇: Calling member of Derived class from virtual function

下一篇: Pointer to member conversion